首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Glut鼠标坐标

Glut鼠标坐标
EN

Stack Overflow用户
提问于 2011-12-04 06:50:42
回答 1查看 2.6K关注 0票数 2

我正在尝试获得一个点的笛卡尔坐标,为此我使用了一个简单的函数来转移窗口坐标,类似于(100,200)。我想把它转换成笛卡尔坐标,问题是窗口大小是可变的,所以我真的不知道如何实现它。

编辑:

操作:

我尝试通过执行以下操作来使用guUnPorject

代码语言:javascript
复制
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];

然而,我得到的位置似乎完全是随机的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-04 08:12:21

鼠标坐标已经是笛卡尔坐标,即窗口空间的坐标。我认为您正在寻找的是到您的OpenGL场景的世界空间的转换。窗口中的2D鼠标坐标缺少一些信息:深度。

所以你所能看到的实际上是从“相机”进入场景的光线。为此,您需要执行从屏幕空间到世界空间的反投影。为此,您使用投影矩阵P和视图矩阵V(由gluLookAt或类似方法生成的矩阵),形成乘积P*V并将其反转,即(P*V)^-1 = V^-1 * P^-1。请注意,倒置不是转置。矩阵的倒置是通过高斯-乔丹消元法完成的,最好是通过一些旋转。任何一本线性代数的数学教科书都会解释这一点。

然后你需要两个矢量来形成一条射线。为此,您使用相同的XY坐标但不同的深度(例如,0和1)获取两个屏幕空间位置,并进行反投影:

代码语言:javascript
复制
(P*V)^-1 * (x, y, {0, 1})

结果向量的差异为您提供了光线方向。

整个反投影过程都被封装到gluUnProject中。然而,我建议不要以GLU的形式使用它,而是通过查看源代码来学习它,或者使用GLM提供的现代替代品。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8371682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档