glProject得到的窗口坐标有有关问题,请
glProject得到的窗口坐标有问题,请高手指点
我在做opengl的拾取,在比较选择对象的深度时,需要用(glProject)将物体坐标转化为窗口坐标(winx,winy,winz),但转化后的winz的倒是能比较出大小,能够达到比较深度的目的,但winx,winy的值却不正常,从几千到负几千。比如一个三角形的三个点的窗口坐标,应该相差不大,而且和鼠标的坐标差不多,但我的程序却不是。
应该是中间的ModelMatrix和ProjMatrix矩阵的问题,但这两个矩阵应该怎么用,或者在对选择对象处理之前的什么地方使用?
有人说是平移、旋转、缩放引起的问题,我通过放缩视景体大小来实现缩放,通过改变视点位置和视线方向来实现平移、旋转,应该没有什么影响啊。后来我又改用glTranslate\glRotate\glScale来实现,问题依旧。
请高手指点,到底可能在什么地方出现问题。
代码太多,不方便全贴,如果需要哪部分,我再贴上来吧,先作揖了。
------解决方案--------------------
// »ñÈ¡·¿ÎݵĴ°¿Ú×ø±ê¡£ 2004.1.13.
bool CCity3DView::GetHouseWindowCoordinate(CPoint3DArray& IntPoint3DArray, CPoint3DArray& OutPoint3DArray)
{
int i, m;
GLint iViewPort[4];
GLdouble dProjMatrix[16];
GLdouble dModelMatrix[16];
long iError;
CPoint3D pp;
CClientDC ClientDC(this);
wglMakeCurrent(ClientDC.m_hDC,pDoc-> Env.hglrc);
glGetIntegerv(GL_VIEWPORT, iViewPort);
glPushMatrix();
glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);
m = IntPoint3DArray.GetSize();
for(i=0;i <m;i++)
{
gluProject(IntPoint3DArray[i].x, IntPoint3DArray[i].y, IntPoint3DArray[i].z,
dModelMatrix, dProjMatrix, iViewPort,
&OutPoint3DArray[i].x, &OutPoint3DArray[i].y, &OutPoint3DArray[i].z);
}
glPopMatrix();
iError = glGetError();
wglMakeCurrent(ClientDC.m_hDC, NULL);//ÊÍ·Å RC£¬ÒÔ±ãÆäËü DC ½øÐлæÍ¼
return true;
}
我在做opengl的拾取,在比较选择对象的深度时,需要用(glProject)将物体坐标转化为窗口坐标(winx,winy,winz),但转化后的winz的倒是能比较出大小,能够达到比较深度的目的,但winx,winy的值却不正常,从几千到负几千。比如一个三角形的三个点的窗口坐标,应该相差不大,而且和鼠标的坐标差不多,但我的程序却不是。
应该是中间的ModelMatrix和ProjMatrix矩阵的问题,但这两个矩阵应该怎么用,或者在对选择对象处理之前的什么地方使用?
有人说是平移、旋转、缩放引起的问题,我通过放缩视景体大小来实现缩放,通过改变视点位置和视线方向来实现平移、旋转,应该没有什么影响啊。后来我又改用glTranslate\glRotate\glScale来实现,问题依旧。
请高手指点,到底可能在什么地方出现问题。
代码太多,不方便全贴,如果需要哪部分,我再贴上来吧,先作揖了。
------解决方案--------------------
// »ñÈ¡·¿ÎݵĴ°¿Ú×ø±ê¡£ 2004.1.13.
bool CCity3DView::GetHouseWindowCoordinate(CPoint3DArray& IntPoint3DArray, CPoint3DArray& OutPoint3DArray)
{
int i, m;
GLint iViewPort[4];
GLdouble dProjMatrix[16];
GLdouble dModelMatrix[16];
long iError;
CPoint3D pp;
CClientDC ClientDC(this);
wglMakeCurrent(ClientDC.m_hDC,pDoc-> Env.hglrc);
glGetIntegerv(GL_VIEWPORT, iViewPort);
glPushMatrix();
glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);
m = IntPoint3DArray.GetSize();
for(i=0;i <m;i++)
{
gluProject(IntPoint3DArray[i].x, IntPoint3DArray[i].y, IntPoint3DArray[i].z,
dModelMatrix, dProjMatrix, iViewPort,
&OutPoint3DArray[i].x, &OutPoint3DArray[i].y, &OutPoint3DArray[i].z);
}
glPopMatrix();
iError = glGetError();
wglMakeCurrent(ClientDC.m_hDC, NULL);//ÊÍ·Å RC£¬ÒÔ±ãÆäËü DC ½øÐлæÍ¼
return true;
}