四元数学习之用四元数旋转向量

四元数学习之用四元数旋转向量

最近对四元数的学习又深入了一些,既然可以用四元数来表示三维物体的旋转,那么如何由一个向量和四元数作用得到一个旋转后的向量呢?

上篇博客讲到了如何将四元数转化为矩阵,这次其实是上一次的延伸,我们知道矩阵可以和向量进行相乘的,方法是将向量填充为四维齐次向量,然后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 );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值