在理解如何在Unity中使用旋转(用四元数表示)时遇到了一些困难。
我想做的是记录一个物体在某个时间的旋转,然后在不久之后找出它的新旋转,并将其转化为在世界空间中围绕X、Y和Z轴旋转了多少度(或弧度)。
我相信这很简单......。
你可以得到两个之间的差异 Quaternion
借用 Quaternion.Inverse
和 *
经营者
首先将旋转存储在一个字段中
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}");
在3D软件中使用四元数的原因之一是避免 "万向节锁定"。欧拉角的任何旋转都是围绕X、Y、Z这三个固定轴进行的3次独立旋转,而四元数则是围绕单一轴进行旋转,它在空间中是自由定向的。四元数.角轴(Quaternion.AngleAxis) 可以给你这个Vetor3轴,以及旋转角度(实际上,四元组由Vector3(X,Y,Z)和角度W组成,一般来说)。所以一个四元数的旋转可以用几个不同的欧拉旋转来表示。
要做你想做的事,你需要首先得到四元数,代表旋转差,而不是实际的旋转。它可以用 四元数.FromToRotation,它使用变换的正向和向上向量作为输入。然后你可以使用 四元组.欧拉角.