我得到了校正后的屏幕协调(左下角为0,0):
GLint realy;
realy = winHeight - (GLint) y - 1;
screen.x = (float)x;
screen.y = (float)realy;
然后我在zNear和zFar获得了世界:
worldNear = glm::unProject(glm::vec3(screen.x, screen.y, 0.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
worldFar = glm::unProject(glm::vec3(screen.x, screen.y, 1.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
但是我设置了这样的Perspective投影,所以我知道zFar和zNear,我不确定上面的代码是否是必要的:
glm :: perspective(fovy,1.0f * winWidth / winHeight,zNear,zFar); (我们需要通过X,Y,Z得到zNear和zFar - 所以我们需要远近取消项目)
另外,检测Zdepth缓冲区如下:
GLfloat depth;
glReadPixels(screen.x, screen.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
像素颜色如下:
GLubyte pixel[3];
glReadBuffer( GL_BACK );
glReadPixels(screen.x, screen.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixel);
问题在这里:我可以得到世界X,Y,Z,但是我需要规范化协调,所以我可以用鼠标顺利移动物体,怎么样?
glm::vec4 normalizePoint = ** ??? **
world.x = normalizePoint.x;
world.y = normalizePoint.y;
world.z = normalizePoint.z;
(目前我的世界坐标太远或太近,这就是问题)
修改:我在第一个问题中找到答案:
iPhone OpenGL : Using gluUnProject (port) and detecting clicking on an object
我需要光线对象碰撞,现在可以使用!!
答案 0 :(得分:0)
将您在屏幕空间中移动的2D矢量(例如(20,0)是20像素右侧)投影到与您正在移动的对象相同深度的世界空间中。
通过视图和投影矩阵将对象位置投影到屏幕空间中,可以找到与对象相同的“相同深度”。
glm::vec3 addThisToYourObjectPosition = glm::unProject(glm::vec3(screenMove.x, screenMove.y, objectProjectedZ), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));