OpenGL屏幕坐标(2D)无法转为世界坐标(3D)的问题
在我的程序中混合使用了
透视投影(gluPerspective())与正交投影(glOrtho()),
结果无法到过屏幕坐标得到世界坐标,必须去掉正交投影的代码才可以得到正确的世界坐标。
不知有哪位高手解决了这个问题,给个答案?
void CGLScene::GetSelectRay(void)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
GLdouble Point3f[3]; //3D坐标
//////////////////////////////////
///我考虑将投影设为正交方式,可能可以成功。但加了这段代码还是没用
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)WinRect.right/(GLfloat)WinRect.bottom,0.1f,100.0f);
////////////////////////////////////////
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,0,
0,0,-10,
0,1,0);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
winX = (float)Mouse.x;
winY = (float)viewport[3] - (float)Mouse.y;
glReadPixels(int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
Point3f[0] = posX;//*100;
Point3f[1] = posY;//*100;
Point3f[2] = posZ;//*100;
IsWorldPos = true;
char ts[256];
ostrstream ostr(ts,sizeof(ts),ios::out);
ostr<<"x="<<Point3f[0]<<",y="<<Point3f[1]<<",z="<<Point3f[2];
//sprintf(ts,"x=%d,y=%d,z=%d",Point3f[0],Point3f[1],Point3f[2]);
MessageBox(NULL,ts,"3D坐标",MB_OK);
return;
}