多重四元数乘法

Multiple quaternion multiplication

//q1、q2 and q3 can be any quaternions only if q1 != q2 != q3
Quaternion q1 = Quaternion.Euler(10, 10, 10);
Quaternion q2 = Quaternion.Euler(20, 20, 20);
Quaternion q3 = Quaternion.Euler(20, 30, 30);

Vector3 v = Vector3.one;
Vector3 v1 = (q1 * q2 * q3) * v;
Vector3 v2 = q3 * (q2 * (q1 * v));

Debug.LogFormat("{0} {1}", v1.ToString("F3"), v2.ToString("F3"));

输出结果表示v1 != v2,表示双向旋转操作是different.Why?

四元数不可交换。因此,一旦您更改乘以它们的顺序,您获得的值也会不同。

来自Unity Documentation

Rotating by the product lhs * rhs is the same as applying the two rotations in sequence: lhs first and then rhs, relative to the reference frame resulting from lhs rotation. Note that this means rotations are not commutative, so lhs * rhs does not give the same rotation as rhs * lhs.

两个乘法的顺序不一样。是的,您从 q1 开始并以 q3 结束,但从左到右的顺序不一样。

Vector3 v1 = (q1 * q2 * q3) * v;

首先,您将得到 q1 * q2 的结果,然后将其乘以 q3

Vector3 v2 = q3 * (q2 * (q1 * v));

而在第二个中你将得到 q3 然后乘以 q2 * (q1 * v)

的结果

正如您所看到的,您没有保留第二个等式中的原始顺序,并且因为它们不可交换,所以您的结果会有所不同。