了解 Unity 中的四元数

Understanding quaternions in Unity

在理解如何在 Unity 中使用旋转(表示为四元数)时遇到一些困难。

我想做的是记录一个物体在某个时间的旋转,然后在不久之后找出它的新旋转,并将其转换为绕X、Y和Z旋转多少度(或弧度)世界上的轴 space 已经发生。

我相信这很简单....

在 3D 软件中使用四元数的原因之一是 "gimbal lock" 回避。欧拉角围绕每 3 个固定轴 - X、Y、Z 进行 3 次独立旋转,进行任何旋转。但是四元数相反,围绕单个轴进行旋转,该轴在 space 中自由定向。 Quaternion.AngleAxis 可以给你这个 Vetor3 轴和旋转角度(实际上,四元数通常由 Vector3(X,Y,Z) 和角度 W 组成)。所以一个四元数旋转可以用几个不同的欧拉旋转来表示。

要为所欲为,首先需要得到四元数,代表旋转差,而不是实际的旋转。可以用 Quaternion.FromToRotation, which uses transform's forward and up vectors as the input. Then you can use Quaternion.eulerAngles.

来完成

您可以使用 Quaternion.Inverse and * operator

获得两个 Quaternion 之间的差异

首先将旋转存储在一个字段中

private Quaternion lastRotation;

// E.g. at the beginning
private void Awake()
{
    lastRotation = transform.rotation;
}

然后稍后在某个地方做,例如

Quaternion currentRotation = transform.rotation;
Quaternion delta = Quaternion.Inverse(beforeRotation) * currentRotation;
// and update lastRotation for the next check
lastRotation = currentRotation;

然后使用 Quaternion.eulerAngles

获得欧拉轴角度表示
var deltaInEulers = delta.eulerAngles;
Debug.Log($"Rotated about {deltaInEulers}");