多个四元数乘法

时间:2017-03-23 11:28:36

标签: unity3d unityscript quaternions

//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,这意味着双向旋转操作不同。为什么?

1 个答案:

答案 0 :(得分:2)

四元数不是可交换的。因此,只要您更改它们的乘法顺序,您获得的值也会有所不同。

来自Unity Documentation

  

按产品旋转lhs * rhs与应用两者相同   顺序旋转:首先是lhs然后是rhs,相对于   由lhs旋转产生的参考系。请注意,这意味着   旋转不是可交换的,所以lhs * rhs不会给出相同的结果   旋转为rhs * lhs。

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

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

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

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

在第二个中,您将q3,然后将其乘以q2 * (q1 * v)的结果

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