首页 > 解决方案 > Unity 中的四元数

问题描述

我正在用 Unity 和 C# 编写一个 3D 的 6DOF 太空射击游戏。我正在使用鼠标和键盘进行移动。使用鼠标,我使用 Quarterions 在 X、Y 和 Z 轴上进行旋转。

我尝试了以下代码:

void Update()
{
    float test = Input.GetAxis("Pitch");
    float test2 = Input.GetAxis("Yaw");

    float test3 = Input.GetAxis("Roll");

    rotX += test;
    Quaternion q1 = Quaternion.AngleAxis(rotX, Vector3.right);


    rotY += test2;
    Quaternion q2 = Quaternion.AngleAxis(rotY, Vector3.up);

    roll += test3;
    Quaternion q3 = Quaternion.AngleAxis(roll, Vector3.forward);

    transform.rotation = q1 * q2 * q3;
}

该代码有效,但不适用于所有角度。看起来每 90 度的移动都不正确(x 轴和 y 轴转动)。我希望这段代码适用于每个角度,这段代码有什么问题?

标签: c#unity3d

解决方案


您正在使用绝对(世界)向量作为参考框架。将 Vector3.up 更改为 transform.up,将 Vector3.forward 更改为 transform.forward,将 Vector3.right 更改为右变换,这样您将沿局部轴旋转,并且云台锁定问题应该较小。

操作顺序仍然很重要,但对于相对较小的增量,它应该按预期工作。

我认为您在分配新旋转之前将四元数相乘是正确的,否则每个局部向量都会随着每次操作而改变 - 行为会略有不同


推荐阅读