【问题标题】:Spaceship: Rolling Sideways宇宙飞船:侧身滚动
【发布时间】:2012-12-14 15:20:18
【问题描述】:

实际上,我正在编写一个小型太空射击游戏(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);

【问题讨论】:

    标签: c# c++ math unity3d


    【解决方案1】:

    几种可能性:

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

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

    【讨论】:

    • 解决方案一是一个好方法,我会试试这个 - 我正在寻找一种数学方法 - 由于船的旋转,用户输入不起作用 -> http://imgur.com/bQ7oG -船应该绕第一个图像中的绿色轴(直接 A & D)和第二个图像中的黄色轴(A&W 或 S&D 或..按下)
    • 感谢您的方法,它指导了我正确的方式:) 现在工作正常:D
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2021-07-27
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多