有趣的是,构建旋转矩阵是一种不需要归一化四元数的操作,为您节省了一个 sqrt:
M = [w*w+x*x-y*y-z*z, 2*(-w*z+x*y), 2*(w*y+x*z);
2*(w*z+x*y), w*w-x*x+y*y-z*z, 2*(-w*x+y*z);
2*(-w*y+x*z), 2*(w*x+y*z), w*w-x*x-y*y+z*z] / (w*w+x*x+y*y+z*z)
(以 MATLAB 风格的表示法)用于四元数 w+x*i+y*j+z*k。
此外,如果您使用齐次坐标和 4x4 变换矩阵,您还可以节省一些除法操作:只需将 3x3 旋转部分作为四元数归一化,然后将其平方长度放入 (4,4 )-元素:
M = [w*w+x*x-y*y-z*z, 2*(-w*z+x*y), 2*(w*y+x*z), 0;
2*(w*z+x*y), w*w-x*x+y*y-z*z, 2*(-w*x+y*z), 0;
2*(-w*y+x*z), 2*(w*x+y*z), w*w-x*x-y*y+z*z, 0;
0, 0, 0, w*w+x*x+y*y+z*z].
乘以平移矩阵等,像往常一样进行完整的转换。这样你就可以做到,例如,
[xh yh zh wh]' = ... * OtherM * M * [xold yold zold 1]';
[xnew ynew znew] = [xh yh zh] / wh.
当然,仍然建议至少偶尔标准化四元数(其他操作也可能需要它)。