我正在尝试获得一个点的笛卡尔坐标,为此我使用了一个简单的函数来转移窗口坐标,类似于(100,200)。我想把它转换成笛卡尔坐标,问题是窗口大小是可变的,所以我真的不知道如何实现它。
编辑:
操作:
我尝试通过执行以下操作来使用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];然而,我得到的位置似乎完全是随机的。
发布于 2011-12-04 08:12:21
鼠标坐标已经是笛卡尔坐标,即窗口空间的坐标。我认为您正在寻找的是到您的OpenGL场景的世界空间的转换。窗口中的2D鼠标坐标缺少一些信息:深度。
所以你所能看到的实际上是从“相机”进入场景的光线。为此,您需要执行从屏幕空间到世界空间的反投影。为此,您使用投影矩阵P和视图矩阵V(由gluLookAt或类似方法生成的矩阵),形成乘积P*V并将其反转,即(P*V)^-1 = V^-1 * P^-1。请注意,倒置不是转置。矩阵的倒置是通过高斯-乔丹消元法完成的,最好是通过一些旋转。任何一本线性代数的数学教科书都会解释这一点。
然后你需要两个矢量来形成一条射线。为此,您使用相同的XY坐标但不同的深度(例如,0和1)获取两个屏幕空间位置,并进行反投影:
(P*V)^-1 * (x, y, {0, 1})结果向量的差异为您提供了光线方向。
整个反投影过程都被封装到gluUnProject中。然而,我建议不要以GLU的形式使用它,而是通过查看源代码来学习它,或者使用GLM提供的现代替代品。
https://stackoverflow.com/questions/8371682
复制相似问题