我正在尝试获取点的笛卡尔坐标,因为我使用的是一个简单的函数,它将窗口坐标转换为(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];
然而,我得到的位置似乎是完全随机的
答案 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提供的现代替代品。