OpenGL屏幕坐标(2D)无法转为世界坐标(3D)的问题

aloneone 2011-09-18 09:17:37
在我的程序中混合使用了
透视投影(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;
}

...全文
215 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧