1

实际上,我正在编写一个小型太空射击游戏(2.5D,Topdown View)。玩家可以沿着 XZ 轴移动并通过右迷你杆(游戏手柄)旋转飞船或查看光标位置(键盘 + 鼠标)。

因此,运动和旋转(Y 轴,偏航)是分开的。整个事情工作正常,看起来不错 - 但现在我想做以下事情:

如果宇宙飞船侧向移动,它应该围绕 X / Pitch 轴旋转 / 左右倾斜一点,取决于侧向速度。

所以,我必须从以下给定输入计算横向速度:

速度矢量(X 和 Z 轴上的运动,Y 始终为“0”)方向矢量(Y 轴上的旋转,X 和 Z 始终为“0”)

通过横向速度,我可以围绕 X 轴旋转我的宇宙飞船,并将得到的四元数乘以围绕 y 轴的旋转。

有谁对此有解决方案吗?


解决方案只需通过飞船的航向“旋转”速度矢量,并使用“roll/z”轴作为围绕 X 轴(您的船头指向的轴)的侧向旋转:

Quaternion Rotation     = Quaternion.Euler(0, mHeading.y, 0);
Vector3 RealVeloctiy    = Quaternion.Euler(0, -mHeading.y, 0) * Velocity; 
float Angle         = RealVeloctiy.z * 2.5f;        
Rotation            = Rotation *   Quaternion.Euler(Angle, 0, 0);
4

1 回答 1

2

几种可能性:

  1. 将速度矢量与飞船的局部左方向进行比较(确保它们首先在相同的坐标空间中)。您可以使用 Vector3.Angle 函数或点积来进行比较。适当缩放结果,并围绕前向轴应用局部旋转。

  2. 直接接受用户输入。如果用户在一个方向扫射,则应用滚动值。您可以使用介于 -1 和 +1 之间的浮点数以及变化率。如果他们向左扫射,则以该速率将值移向 -1,或者如果他们向左扫射,则将值移至 +1。如果两个键都没有被按下,则将值移回 0。(您可能也想玩弄 Lerp、SmoothStep 和 SmoothDamp 函数)。缩放值以围绕相关轴应用适当的旋转。

于 2012-12-29T23:32:03.870 回答