多重四元数乘法
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?
四元数不可交换。因此,一旦您更改乘以它们的顺序,您获得的值也会不同。
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)
的结果
正如您所看到的,您没有保留第二个等式中的原始顺序,并且因为它们不可交换,所以您的结果会有所不同。
//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?
四元数不可交换。因此,一旦您更改乘以它们的顺序,您获得的值也会不同。
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)
正如您所看到的,您没有保留第二个等式中的原始顺序,并且因为它们不可交换,所以您的结果会有所不同。