过剩鼠标坐标
Posted
技术标签:
【中文标题】过剩鼠标坐标【英文标题】:Glut Mouse Coordinates 【发布时间】:2011-12-03 22:50:41 【问题描述】:我正在尝试获取一个点的笛卡尔坐标,因为我正在使用一个简单的函数来传递窗口坐标,例如 (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];
但是我得到的位置似乎完全随机
【问题讨论】:
【参考方案1】:鼠标坐标已经是笛卡尔坐标,即窗口空间的坐标。我认为您正在寻找的是转换到您的 OpenGL 场景的世界空间。窗口中的 2D 鼠标坐标缺少一些信息:深度。
所以你能得到的实际上是从“相机”射入场景的光线。为此,您需要执行从屏幕空间到世界空间的反向投影。为此,您采用投影矩阵 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 提供的现代替代品。
【讨论】:
@user697110:你什么时候执行这些步骤,你获得了哪个投影和模型视图矩阵(即在你的程序的哪个点从 OpenGL 获取它们)? @user697110:那时您阅读了一些投影和模型视图,但可能不是视图转换后出现的那个。这将是矩阵堆栈中的最后一个,当然不是您想要的。发布您的完整代码(在 pastebin.com 上),我将对其进行修改以使其正常工作。 感谢您的帮助,但我刚刚发现,毕竟在这项工作中,我们不需要使用缩放、旋转或可变窗口,所以它只是让工作变得更加简单。无论如何感谢您的帮助以上是关于过剩鼠标坐标的主要内容,如果未能解决你的问题,请参考以下文章