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 <QCoreApplication>
    #include <QQuaternion>
    #include <QVector3D>
    #include <QDebug>

    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();

    }

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

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

相关推荐
fengbingchun23 分钟前
Qt中的事件循环
qt
秋风&萧瑟3 小时前
【QT】练习1
开发语言·qt·命令模式
byxdaz4 小时前
Qt中绘制不规则控件
开发语言·qt
繁星蓝雨4 小时前
Qt使用QGraphicsView绘制线路图————附带详细实现代码
开发语言·qt
学习是种信仰啊5 小时前
QT文件操作(QT实操学习3)
开发语言·qt·学习
钱彬 (Qian Bin)6 小时前
QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计
c++·qt·教程·音乐播放器·qml·qt quick
17´9 小时前
Qt从入门到入土(十一) -数据库操作--MySQL
数据库·c++·qt·mysql·sqlite
TechNomad9 小时前
Qt进阶开发:对象树与拥有权
qt
胡斌附体11 小时前
Qt之QTextEdit控制文本滚动, 停止滚动, 开始滚动, 鼠标控制滚动
开发语言·c++·qt
老秦包你会1 天前
QT第六课------QT界面优化------QSS
开发语言·qt