2013-06-28 136 views
2

我正在写使用OpenGL一个MFC C++应用程序。该程序允许绘制和操作三维物体。现在我想找到坐标,在与我的对象相同的坐标空间中,在任何地方我点击屏幕上的鼠标。OpenGL的坐标变换Sceen到世界

到目前为止,我一直在使用glReadPixels和gluUnProject的组合,它一直在努力,但只有当我点击我的鼠标的地方在那里的对象已经被绘制。如果我点击物体外的任何地方,所获得的坐标都完全关闭。

所以我想知道如何改变我的代码,这样我可以找到坐标空间我的对象是在屏幕上的任何位置坐标。下面是我一直使用的代码:

GLint viewport[4]; 
GLdouble ox, oy, oz;//the coordinates I need 
GLfloat winZ = 0.0; 
::glGetIntegerv(GL_VIEWPORT, viewport); 
::glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix); 
::glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix); 
GLfloat winX = (float)point.x;//point.x and point.y are the mouse coordinates 
GLfloat winY = (float)viewport[3] - (float)point.y; 

::glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); 

gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz); 
+0

你的屏幕是2D的,你的世界是3D的。屏幕上的每个2D位置不是与3D点相对应,而是与射线/线/线段相对应。出于好奇,如果'winZ'是1,'gluUnProject'会返回什么? –

+0

即使winZ为1,它也会每次返回1。请问您能详细说明每个2D点如何对应于射线/线/线段吗?什么是重要性和方向? –

回答

0

gluUnProject采取窗口空间坐标和联合国项目将它们与世界观投射视变换的倒数。如果坐标与现有对象相对应,则不知道。

当你清除深度缓存,它与被读取为1.0 glReadPixels价值无处不在初始化。

当对象的可见片段被吸引他们将通过深度测试和将覆盖的深度值与每个像素相交这些片段更小的值。

这意味着每次你读的深度缓冲像素与1.0的值时,这意味着什么可见已在像素被吸引,这就是你得到的结果是完全关闭。

+0

是的,你是绝对正确的,当我从没有可见碎片的点读取时,winZ总是返回1.0。那么在那种情况下,我不可能用我目前的方法来实现我想要做的事情?如果有的话,我应该使用哪些其他功能? 我想我需要的是一个世界转型的屏幕? –

相关问题