宇宙飞船:侧身滚动

时间:2012-12-29 19:20:33

标签: c# c++ math unity3d

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

因此,运动和旋转(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);

1 个答案:

答案 0 :(得分:2)

有几种可能性:

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

  2. 直接接受用户输入。如果用户正在向某个方向扫射,请应用滚动值。您可以使用介于-1和+1之间的浮点数以及变化率。如果它们向左扫描,则以该速率将值移向-1,或者如果它们向左扫描,则移至+1。如果没有按下任何键,则将值移回0.(您可能也喜欢使用Lerp,SmoothStep和SmoothDamp函数)。缩放该值以对相关轴应用适当的旋转。