OpenGL:规范世界协调

时间:2012-01-26 22:30:58

标签: c++ opengl

我得到了校正后的屏幕协调(左下角为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

我需要光线对象碰撞,现在可以使用!!

1 个答案:

答案 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));