qt QQuaternion详解

发布于:2025-03-29 ⋅ 阅读:(27) ⋅ 点赞:(0)
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();
}

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

           

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