qt QQuaternion详解

1. 概述

QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分,可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。

2. 重要方法
  • 默认构造函数

    复制代码
    QQuaternion::QQuaternion(); // 构造单位四元数 (1, 0, 0, 0)
  • 从标量和向量构造

    复制代码
    QQuaternion::QQuaternion(float scalar, const QVector3D &vector); // 从标量和向量构造四元数
    QQuaternion::QQuaternion(float scalar, float xpos, float ypos, float zpos); // 从标量和三个坐标构造四元数
  • QVector4D 构造

    复制代码
    QQuaternion::QQuaternion(const QVector4D &vector); // 从 QVector4D 构造四元数
基本操作
  • 共轭

    复制代码
    QQuaternion QQuaternion::conjugated() const; // 返回四元数的共轭
  • 点积

    复制代码
    static float QQuaternion::dotProduct(const QQuaternion &q1, const QQuaternion &q2); // 返回两个四元数的点积
  • 从轴和角度构造

    复制代码
    static QQuaternion QQuaternion::fromAxisAndAngle(const QVector3D &axis, float angle); // 从轴和角度构造四元数
    static QQuaternion QQuaternion::fromAxisAndAngle(float x, float y, float z, float angle); // 从轴和角度构造四元数
  • 归一化

    复制代码
    void QQuaternion::normalize(); // 归一化四元数
    QQuaternion QQuaternion::normalized() const; // 返回归一化的四元数
  • 旋转向量

    复制代码
    QVector3D QQuaternion::rotatedVector(const QVector3D &vector) const; // 旋转一个向量
  • 设置和获取分量

    复制代码
    void QQuaternion::setScalar(float scalar); // 设置标量部分
    void QQuaternion::setVector(const QVector3D &vector); // 设置向量部分
    float QQuaternion::scalar() const; // 获取标量部分
    QVector3D QQuaternion::vector() const; // 获取向量部分
转换
  • 欧拉角

    复制代码
    void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const; // 获取欧拉角
    QVector3D QQuaternion::toEulerAngles() const; // 返回欧拉角
  • 旋转矩阵

    复制代码
    QMatrix3x3 QQuaternion::toRotationMatrix() const; // 转换为旋转矩阵
  • 四元数到 QVector4D

    复制代码
    QVector4D QQuaternion::toVector4D() const; // 转换为 QVector4D
其他
  • 长度

    复制代码
    float QQuaternion::length() const; // 返回四元数的长度
    float QQuaternion::lengthSquared() const; // 返回四元数的长度平方
  • 检查

    复制代码
    bool QQuaternion::isIdentity() const; // 检查是否为单位四元数
    bool QQuaternion::isNull() const; // 检查是否为零四元数
  • 插值

    复制代码
    static QQuaternion QQuaternion::slerp(const QQuaternion &q1, const QQuaternion &q2, float t); // 球面线性插值
    static QQuaternion QQuaternion::nlerp(const QQuaternion &q1, const QQuaternion &q2, float t); // 归一化线性插值
运算符重载
  • 乘法

    复制代码
    QQuaternion &QQuaternion::operator*=(float factor); // 乘以标量
    QQuaternion &QQuaternion::operator*=(const QQuaternion &quaternion); // 乘以另一个四元数
  • 加法

    复制代码
    QQuaternion &QQuaternion::operator+=(const QQuaternion &quaternion); // 加法
  • 减法

    复制代码
    QQuaternion &QQuaternion::operator-=(const QQuaternion &quaternion); // 减法
  • 除法

    复制代码
    QQuaternion &QQuaternion::operator/=(float divisor); // 除以标量

    #include
    #include
    #include
    #include

    int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    复制代码
      // 构造一个四元数
      QQuaternion quaternion(0.7071, 0.7071, 0.0, 0.0);
    
      // 归一化四元数
      quaternion.normalize();
    
      // 获取四元数的标量和向量部分
      float scalar = quaternion.scalar();
      QVector3D vector = quaternion.vector();
    
      qDebug() << "Scalar:" << scalar;
      qDebug() << "Vector:" << vector;
    
      // 旋转一个向量
      QVector3D originalVector(1.0, 0.0, 0.0);
      QVector3D rotatedVector = quaternion.rotatedVector(originalVector);
    
      qDebug() << "Original Vector:" << originalVector;
      qDebug() << "Rotated Vector:" << rotatedVector;
    
      // 转换为欧拉角
      QVector3D eulerAngles = quaternion.toEulerAngles();
      qDebug() << "Euler Angles:" << eulerAngles;
    
      return app.exec();

    }

觉得有帮助的话,打赏一下呗。。

需要商务合作(定制程序)的欢迎私信!!

相关推荐
乌托邦2号6 分钟前
Qt实现CS的自动化构建流程
qt·自动化
小短腿的代码世界1 小时前
WebSocket协议在Qt中的工业级实现:5层架构设计与万级并发压测验证
qt·websocket·网络协议
金色熊族4 小时前
Qt绘制图形时自定义点划线间隔的办法--setDashPattern
qt
小短腿的代码世界17 小时前
Qt行情协议解析与二进制编解码优化:从FIX到自定义协议的全链路架构
开发语言·qt·架构
luoyayun36118 小时前
Qt/QML + FFmpeg 实现多音频文件顺序拼接功能
qt·ffmpeg·音频拼接
Strugglingler20 小时前
【Qt,OpenGL, RHI,Wayland 等概念梳理】
qt·opengl·wayland·rhi·x11·egl·glx
小短腿的代码世界1 天前
Qt对象树析构链与智能指针协同:零泄漏内存管理架构
开发语言·qt·架构
小庞在加油1 天前
从qmake到CMake+VSCode:Qt项目现代化迁移与AI提效实战指南
vscode·qt·ai·ai工具
小短腿的代码世界1 天前
Qt定时器高精度架构:从QTimer源码到纳秒级定时调度
数据库·qt·架构
尘中远1 天前
Qt高性能绘图库QIm——实现二维三维科学绘图
开发语言·qt·信息可视化