【发布时间】:2012-02-20 00:52:55
【问题描述】:
我得到了更正的屏幕坐标(左下角的 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));
但我这样设置透视投影,所以我知道 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
我需要射线-物体碰撞,现在可以了!!
【问题讨论】:
-
标准化是什么意思?通常是指将向量除以标量以将其置于标准形式(通常是单位长度)。您的代码看起来不错,但我质疑您为什么要读取后台缓冲区和 z 缓冲区,而您可以直接与您的世界位置进行光线对象碰撞。
-
问题是我们不明白您的要求或您想要做什么。例如,您对“规范化”等术语的使用是非标准且令人困惑的。