Glut Mouse Coordinates

时间:2011-12-03 22:50:42

标签: opengl glut

我正在尝试获取点的笛卡尔坐标,因为我使用的是一个简单的函数,它将窗口坐标转换为(100,200)。我想将其转换为笛卡尔坐标,问题是窗口大小是可变的,所以我真的不知道如何实现它。

编辑:

OP:

我尝试通过做类似的事情来使用guUnPorject

GLdouble modelMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
GLdouble projMatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);


double position[3];
 gluUnProject(
  x,
   y,
  1,
 modelMatrix,
 projMatrix,
 viewport,
 &position[0], //-> pointer to your own position (optional)
 &position[1], // id
 &position[2] // 
 );

 cout<<position[0];

然而,我得到的位置似乎是完全随机的

1 个答案:

答案 0 :(得分:2)

鼠标坐标已经是笛卡尔坐标,即窗口空间的坐标。我认为你正在寻找的是转换到你的OpenGL场景的世界空间。窗口中的2D鼠标坐标缺少一些信息:深度。

所以你可以otain实际上是从“相机”进入场景的光线。为此,您需要执行从屏幕空间到世界空间的反投影。为此,您将投影矩阵P和视图矩阵V(由gluLookAt或类似物生成的内容)形成乘积P * V并将其反转,即(P * V)^ - 1 = V ^ -1 * P ^ - 1。请注意,反演不是换位。通过Gauss-Jordan消除来完成反转矩阵,优选地通过一些旋转来完成。任何关于线性代数的数学教科书都会解释它。

然后你需要两个矢量来形成一条射线。为此,您需要两个具有相同XY坐标但深度不同的屏幕空间位置(例如,0和1)并执行反投影:

(P*V)^-1 * (x, y, {0, 1})

结果矢量的差异为您提供光线方向。

整个反投影过程已经包含在gluUnProject中。但是我建议不要在GLU表单中使用它,但要么查看源代码以便从中学习,要么使用像GLM提供的现代替代品。