【问题标题】:Ray picking with gluUnProject()使用 gluUnProject() 进行光线拾取
【发布时间】:2010-12-02 09:35:26
【问题描述】:

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

【问题讨论】:

  • 什么时候抓取modelView矩阵?在glRotatef()之前还是之后?

标签: opengl picking


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多