Ray采用gluUnProject()

我在y = -50飞机上有一个四边形。 此刻,我想要做的就是获取鼠标点击四边形的坐标。 我设法在一定程度上做到了这一点。 问题在于绘制四边形时我应用的转换没有考虑到。 我可以添加一些常量并使其工作,但我让用户使用glRotatef()围绕x和y轴旋转场景,因此一旦发生旋转,坐标就会变得混乱。

这就是我现在正在做的事情:

我调用gluUnProject()两次,一次使用z = 0,一次使用z = 1。

gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 0, modelView, projection, viewport, &x1, &y1, &z1);
gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 1, modelView, projection, viewport, &x2, &y2, &z2);

归一化射线矢量:

x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
mag = sqrt(x*x + y*y + z*z);
x /= mag;
y /= mag;
z /= mag;

参数方程:

float t = -(camY) / y;
planeX = camX + t*x;
planeY = camY + t*y;
planeZ = camZ + t*z;

其中(camX,camY,camZ)是传递给gluLookAt()的相机位置。

我需要planeX,planeY和planeZ作为四边形上点击的坐标,在我用来绘制四边形的同一个坐标系中。 我怎样才能做到这一点?


你不应该通过你选择的明确的z深度。 为了找到世界坐标,您需要传入特定鼠标坐标处的深度缓冲区值。

GLfloat depth;
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

将它传递给你的gluUnProject应该产生你正在寻找的值。 另外,正如genpfault在他的评论中所说的那样,确保您在正确的时刻抓取模型视图矩阵数据。 否则,你有错误的矩阵。

链接地址: http://www.djcxy.com/p/81745.html

上一篇: Ray picking with gluUnProject()

下一篇: How to share C++ source code files between projects in Visual Studio?