OpenGL:如何计算鼠标在3d空间中指向的角度?

时间:2010-07-27 14:37:06

标签: c++ opengl mouse-coordinates

我只需要知道光标所指向的角度(x,y,z向量)。所以我可以朝着我指向的方向射击任何粒子。

我无法使用深度测试,所以典型的拣选方法不是一种选择。

这只能用纯数学吗?如果我知道视口纵横比和透视等?

编辑:我需要从空场景中获取坐标。完全是空的,根本没有绘图!

4 个答案:

答案 0 :(得分:2)

简单的答案是渲染场景的一部分涉及将世界坐标转换为观察坐标 - 基本上,相对于我的眼球,所有这些东西都在哪里。

视图平面是鼠标所在的屏幕。如果您的鼠标坐标为(xx,yy),那么它可能位于视图坐标中的(xx,yy,1)或(xx,yy,-1)。您可能需要使用一个系统,其中(0,0)是屏幕上视口的中心 - 而不是鼠标坐标的正常工作方式,但是常量偏移很容易。

zz = 0是玩家所在的位置,而视图平面在玩家和他能看到的人之间是前方的短距离。这就是为什么视平面在这里被视为(xx,yy,1)或(xx,yy,-1)的原因 - 如果你使用具有正z的视图坐标的+1(正常情况,我认为)对象在你面前。

要将此转换回世界坐标,请应用您所做的相同转换来转换您的世界坐标以查看坐标,但向后转换。然后,您可以在世界坐标中获得鼠标指针位置。要获得方向向量,请减去玩家位置。

向后转换在每一步使用逆矩阵,并向后应用步骤。原则上,所有步骤可以组合成单个矩阵,并且可以为整个变换计算逆矩阵 - 但这不是最佳方法。例如,计算旋转的倒数比计算一般矩阵逆更容易。如果从世界坐标到视图坐标的转换是根据需要从组件(位置,方向......)组成的,那么您实际上只需要计算反转的组件并将它们组合起来。而不是30度左(从世界到视图),你使用30度右(从视图到世界)等。

如果你很幸运,你可以完全放弃玩家位置的整个问题 - 计算视图空间中鼠标指针的角度(欧拉角度就足够了),然后仅应用方向部分视图转换。

不,这是公式,对不起,部分是因为视图到世界的转换取决于你如何进行世界到视图的转换,部分原因是因为我没有一个简单的例子可供参考。

虽然问题不同,但您可以在这里的答案中找到一些相关的参考资料......

Matrix multiplication - view/projection, world/projection, etc

答案 1 :(得分:2)

如果你认为你的整个场景都适合金字塔,你的眼睛在峰顶(朝向底座),你的屏幕是一个平行于基座的横截面,整个场景投射到这个横截面上(进入2D空间)。据推测,您知道屏幕的尺寸以及光标在2D空间中的位置。

您可以从X侧查看该金字塔,然后再从Y侧查看,将问题转换为两个直角三角形。三角形的底边由从“眼睛”到屏幕中心的直线定义,斜边由“眼睛”到光标的直线定义。

当光标位于2D显示的最左角时,您知道角度(给定的透视信息),因此您可以确定“眼睛”距离2D投影平面的距离(或者您的基础长度)三角形),以像素为单位。使用该长度和三角形另一侧的长度(光标的x坐标或y坐标),您可以确定角度。所有这些都使用基本的trig。

如果有帮助,请绘制出所有相关的三角形:

  • (0, 0)定义的三角形; (base, 0); (base, Y_MAX)其中Y_MAX是光标的最大值(屏幕的上边缘)。 base = Y/tan(max_angle)
  • (0, 0)定义的三角形; (base, 0); (base, X_MAX)
  • (0, 0)定义的三角形; (base, 0); (base, Y),其中Y是光标的y位置。 angle = (tan^(-1))(Y/base)
  • (0, 0)定义的三角形; (base, 0); (base, X)

答案 2 :(得分:1)

答案 3 :(得分:0)

除非您选择的子弹在某个范围内引爆(因此与物体的距离很重要),否则您只需要视轴与平面的交点来确定您的角度。

将光标限制在垂直于您的观察方向的平面上,并与您保持一定距离。然后从枪管出口的位置到光标的位置,并从那里计算你的角度。