实际上,我正在编写一个小型太空射击游戏(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);
答案 0 :(得分:2)
有几种可能性:
将速度矢量与宇宙飞船的左侧方向进行比较(确保它们首先位于相同的坐标空间中)。您可以使用Vector3.Angle函数或点积来进行比较。适当缩放结果,并在前轴周围应用局部旋转。
直接接受用户输入。如果用户正在向某个方向扫射,请应用滚动值。您可以使用介于-1和+1之间的浮点数以及变化率。如果它们向左扫描,则以该速率将值移向-1,或者如果它们向左扫描,则移至+1。如果没有按下任何键,则将值移回0.(您可能也喜欢使用Lerp,SmoothStep和SmoothDamp函数)。缩放该值以对相关轴应用适当的旋转。