QQuaternion四元数类

利用四元数获得旋转矩阵

QMatrix4x4 fromQuaternion(QQuaternion &q)
{
    QMatrix4x4 mat ;
    mat.setToIdentity();
    float x = q.x();
    float y = q.y();
    float z = q.z();
    float w = q.scalar();

    float x2 = x * x;
    float xy = x * y;
    float xz = x * z;
    float y2 = y * y;
    float yz = y * z;
    float z2 = z * z;
    mat(0, 0) = 1 - 2 * (y2 + z2);
    mat(0, 1) = 2 * (xy - w * z);
    mat(0, 2) = 2 * (xz + w * y);
    mat(0, 3) = 0;
    mat(1, 0) = 2 * (xy + w * z);
    mat(1, 1) = 1 - 2 * (x2 + z2);
    mat(1, 2) = 2 * (yz - w * x);
    mat(1, 3) = 0;
    mat(2, 0) = 2 * (xz - w * y);
    mat(2, 1) = 2 * (yz + w * x);
    mat(2, 2) = 1 - 2 * (x2 + y2);
    mat(2, 3) = 0;


    return mat;
}

下面同时给出Eigen中的四元数类

Eigen::Matrix4f fromQuaternion(Eigen::Quaternion<float> &q)
{
    Eigen::Matrix4f mat = Eigen::Matrix4f::Identity();

    float x = q.x();
    float y = q.y();
    float z = q.z();
    float w = q.w();

    float x2 = x * x;
    float xy = x * y;
    float xz = x * z;
    float y2 = y * y;
    float yz = y * z;
    float z2 = z * z;
    mat(0, 0) = 1 - 2 * (y2 + z2);
    mat(0, 1) = 2 * (xy - w * z);
    mat(0, 2) = 2 * (xz + w * y);
    mat(0, 3) = 0;
    mat(1, 0) = 2 * (xy + w * z);
    mat(1, 1) = 1 - 2 * (x2 + z2);
    mat(1, 2) = 2 * (yz - w * x);
    mat(1, 3) = 0;
    mat(2, 0) = 2 * (xz - w * y);
    mat(2, 1) = 2 * (yz + w * x);
    mat(2, 2) = 1 - 2 * (x2 + y2);
    mat(2, 3) = 0;
    return mat;
}

如果在Qt工程中那么就用第一个类,在非Qt中用Eigen,也可以自定义四元数类,如果想偷懒Qt和Eigen的四元数类就够用了。
其中四元数的累积,可以直接利用乘法,如下:

    Eigen::Quaternionf eq1(0.5, 1.0, 0.0, 0.0);
    Eigen::Quaternionf eq2(0.5, 1.0, 0.0, 0.0);
    Eigen::Quaternionf eq = multiquaternion(eq1, eq2);

QQuaternion 的用法和Eigen类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值