Opengl Glut鼠标坐标
我试图获得一个点的笛卡尔坐标,因为我使用了一个简单的函数,这个函数导出了一个窗口坐标,比如(100200)。我想把它转换成笛卡尔坐标,问题是窗口大小是可变的,所以我真的不知道如何实现它 编辑: 作品: 我试着通过做这样的事情来使用GUNPROJECTOpengl Glut鼠标坐标,opengl,glut,Opengl,Glut,我试图获得一个点的笛卡尔坐标,因为我使用了一个简单的函数,这个函数导出了一个窗口坐标,比如(100200)。我想把它转换成笛卡尔坐标,问题是窗口大小是可变的,所以我真的不知道如何实现它 编辑: 作品: 我试着通过做这样的事情来使用GUNPROJECT GLdouble modelMatrix[16]; glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); GLdouble projMatrix[16]; glGetDoublev(GL_PROJECTION
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];
GLdouble-modelMatrix[16];
glGetDoublev(GL_模型视图_矩阵,模型矩阵);
GLdouble projMatrix[16];
glGetDoublev(GL_投影矩阵,projMatrix);
双位[3];
GlunProject(
x,,
Y
1.
模型矩阵,
projMatrix,
视口,
&位置[0],//-指向您自己位置的指针(可选)
&位置[1],//id
&位置[2]//
);
cout鼠标坐标已经是笛卡尔坐标,即窗口空间的坐标。我认为您正在寻找的是到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提供的现代替代品。@user697110:您何时执行这些步骤,以及您获得了哪些投影和模型视图矩阵(即在程序的哪个点从OpenGL获取它们)?@user697110:当时你读了一些投影和模型视图,但可能不是视图转换后出现的那个。这将是矩阵堆栈中的最后一个,当然不是您想要的。发布你的完整代码(在pastebin.com上),我会修改它以使其正常工作。谢谢你的帮助,但我刚刚发现,毕竟在这项工作中,我们不需要使用缩放、旋转或可变窗口,因此它只会使工作更简单。无论如何谢谢你的帮助