了解 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;
获得欧拉轴角度表示
var deltaInEulers = delta.eulerAngles;
Debug.Log($"Rotated about {deltaInEulers}");
在理解如何在 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;
获得欧拉轴角度表示
var deltaInEulers = delta.eulerAngles;
Debug.Log($"Rotated about {deltaInEulers}");