QQuaternion四元数类

来源:互联网 发布:淘宝服装的平铺和挂拍 编辑:程序博客网 时间:2024/06/07 06:32

利用四元数获得旋转矩阵

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类似。

0 0
原创粉丝点击