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

    }

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

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

相关推荐
伐尘11 小时前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio
吃面不喝汤6612 小时前
破解 Qt QProcess 在 Release 模式下的“卡死”之谜
开发语言·qt
charlie11451419119 小时前
逐步理解Qt信号与槽机制
数据库·qt
yaso_zhang1 天前
当生产了~/qt-arm/bin/qmake,可以单独编译其他-源码的某个模块,如下,编译/qtmultimedia
qt
code bean1 天前
【Qt/C++】深入理解 Lambda 表达式与 `mutable` 关键字的使用
开发语言·c++·qt
爱看书的小沐2 天前
【小沐学GIS】基于C++绘制二维瓦片地图2D Map(QT、OpenGL、GIS)
c++·qt·gis·opengl·glfw·glut·二维地图
炬火初现2 天前
Qt 的原理及使用(1)——qt的背景及安装
开发语言·qt
weixin_1102 天前
Qt 无边框窗口,支持贴边分屏
c++·qt
gaoenyang7605252 天前
QT Creator配置Kit
开发语言·qt
3D打印-HUSTAIBO2 天前
QT中connect高级链接——指针、lambda、宏
qt