过剩鼠标坐标

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 上),我将对其进行修改以使其正常工作。 感谢您的帮助,但我刚刚发现,毕竟在这项工作中,我们不需要使用缩放、旋转或可变窗口,所以它只是让工作变得更加简单。无论如何感谢您的帮助

以上是关于过剩鼠标坐标的主要内容,如果未能解决你的问题,请参考以下文章

Qt 如何获取滚动窗体中鼠标点击的坐标

将鼠标坐标转换为世界空间坐标

js怎么获得鼠标当前坐标

jsp里面,怎么获取鼠标在网页中的坐标?

api 易语言 获取鼠标点击时的坐标

unity3D鼠标坐标和世界坐标问题