四元数学习之用四元数旋转向量
最近对四元数的学习又深入了一些,既然可以用四元数来表示三维物体的旋转,那么如何由一个向量和四元数作用得到一个旋转后的向量呢?
上篇博客讲到了如何将四元数转化为矩阵,这次其实是上一次的延伸,我们知道矩阵可以和向量进行相乘的,方法是将向量填充为四维齐次向量,然后4×4的矩阵左乘4×1的列向量,得到的是4×1的列向量,就是经过转换后的向量,再去掉齐次即可。
接上面一篇博客的论述,如果将四元数转化为矩阵的话,看上去是这样:
注意,上面的矩阵是行主序的,我们知道OpenGL的矩阵是列主序的。
将矩阵和一个向量相乘,就会得到经过旋转后的向量了。乘法过程非常简单,这里直接贴出代码。
void Quaternion::RotateVector( float vector[] ) const { Q_ASSERT( vector != Q_NULLPTR ); float x22 = 2 * x * x, y22 = 2 * y * y, z22 = 2 * z * z, w22 = 2 * w * w; float xy2 = 2 * x * y, zw2 = 2 * z * w, xz2 = 2 * x * z, yw2 = 2 * y * w; float yz2 = 2 * y * z, xw2 = 2 * x * w; float vx = vector[0], vy = vector[1], vz = vector[2]; vector[0] = vx * ( x22 + w22 - 1 ) + vy * ( xy2 - zw2 ) + vz * ( xz2 + yw2 ); vector[1] = vx * ( xy2 + zw2 ) + vy * ( y22 + w22 - 1 ) + vz * ( yz2 - xw2 ); vector[2] = vx * ( xz2 - yw2 ) + vy * ( yz2 + xw2 ) + vz * ( z22 + w22 - 1 ); }