使用gluUnProject进行光线拾取()

时间:2010-12-02 09:35:26

标签: opengl picking

我在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成为四边形点击的坐标,在我用来绘制四边形的相同坐标系中。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

将其传递到gluUnProject应该会产生您正在寻找的值。另外,正如genpfault在他的评论中所说,确保你正在抓住模型视图矩阵数据。否则,你的矩阵就错了。