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
- QQuaternion四元数类
- 关于Ogre四元数类的一些解释
- 《C和指针》——数组的奇怪形式
- HashMap的实现原理及hash冲突解决方法
- JVM基础篇——类的加载过程
- 【转】web.xml中classpath是什么含义
- iOS 移除所有子视图的方法
- QQuaternion四元数类
- 《C和指针》——指向数组的指针(逐个移动和逐行的区别)
- K1 K2 傻瓜刷机、自动刷入Breed 华硕Padavan 辅助工具 (v2.1)
- ART和Dalvik区别以及Android的几种进程
- Android QQ第三方登录的使用
- 《C和指针》——字符数组和字符串常量的区别
- 关于IP网段间互访的问题——路由是根本
- 关于App进入background状态
- 时间转换 Unix时间戳 站长工具练习