1

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

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

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

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

4

4 回答 4

2

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

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

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

要将其转换回世界坐标,请应用与将世界坐标转换为视图坐标相同的转换,但要向后转换。然后,您可以在世界坐标中获得鼠标指针位置。要获得方向向量,请减去您的玩家位置。

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

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

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

尽管问题不同,但您可以在此处的答案中找到一些相关参考资料...

矩阵乘法 - 视图/投影、世界/投影等

于 2010-07-27T15:06:54.307 回答
2

如果您认为您的整个场景都适合金字塔,并且您的眼睛在顶部(看向底部),那么您的屏幕是一个与底部平行的横截面,整个场景都被投影到上面(进入 2D 空间)。大概,您知道屏幕的尺寸,以及光标在 2D 空间中的位置。

你可以从 X 面看那个金字塔,然后再从 Y 面看,把问题变成两个直角三角形。三角形的底边由“眼睛”到屏幕中心的连线定义,斜边由“眼睛”到光标的连线定义。

将光标放在 2D 显示器的极端角落,您可以知道角度(给定透视信息),因此您可以确定“眼睛”与 2D 投影平面的距离(或三角形底边的长度),以像素为单位。使用该长度和三角形另一边的长度(光标的 x 或 y 坐标),您可以确定角度。所有这些都使用基本触发。

如果有帮助,请画出所有有问题的三角形:

  • (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).
于 2010-07-27T15:08:20.563 回答
1

胶合项目

于 2010-07-27T16:36:06.983 回答
0

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

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

于 2010-07-27T15:06:10.360 回答