QQuaternion Class

QQ 四元数类表示由向量和标量组成的四元数。更多

头文件: #include <QQuaternion>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

公共函数

QQuaternion()
QQuaternion(const QVector4D &vector)
QQuaternion(float scalar, const QVector3D &vector)
QQuaternion(float scalar, float xpos, float ypos, float zpos)
QQuaternion conjugated() const
void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const
void getAxisAndAngle(float *x, float *y, float *z, float *angle) const
void getAxisAndAngle(QVector3D *axis, float *angle) const
void getEulerAngles(float *pitch, float *yaw, float *roll) const
QQuaternion inverted() const
bool isIdentity() const
bool isNull() const
float length() const
float lengthSquared() const
void normalize()
QQuaternion normalized() const
QVector3D rotatedVector(const QVector3D &vector) const
float scalar() const
void setScalar(float scalar)
void setVector(const QVector3D &vector)
void setVector(float x, float y, float z)
void setX(float x)
void setY(float y)
void setZ(float z)
QVector3D toEulerAngles() const
QMatrix3x3 toRotationMatrix() const
QVector4D toVector4D() const
QVector3D vector() const
float x() const
float y() const
float z() const
QVariant operator QVariant() const
QQuaternion &operator*=(const QQuaternion &quaternion)
QQuaternion &operator*=(float factor)
QQuaternion &operator+=(const QQuaternion &quaternion)
QQuaternion &operator-=(const QQuaternion &quaternion)
QQuaternion &operator/=(float divisor)

静态公共成员

float dotProduct(const QQuaternion &q1, const QQuaternion &q2)
QQuaternion fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis)
QQuaternion fromAxisAndAngle(const QVector3D &axis, float angle)
QQuaternion fromAxisAndAngle(float x, float y, float z, float angle)
QQuaternion fromDirection(const QVector3D &direction, const QVector3D &up)
QQuaternion fromEulerAngles(float pitch, float yaw, float roll)
QQuaternion fromEulerAngles(const QVector3D &eulerAngles)
QQuaternion fromRotationMatrix(const QMatrix3x3 &rot3x3)
QQuaternion nlerp(const QQuaternion &q1, const QQuaternion &q2, float t)
QQuaternion rotationTo(const QVector3D &from, const QVector3D &to)
QQuaternion slerp(const QQuaternion &q1, const QQuaternion &q2, float t)
bool qFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2)
bool operator!=(const QQuaternion &q1, const QQuaternion &q2)
QQuaternion operator*(const QQuaternion &q1, const QQuaternion &q2)
QVector3D operator*(const QQuaternion &quaternion, const QVector3D &vec)
QQuaternion operator*(const QQuaternion &quaternion, float factor)
QQuaternion operator*(float factor, const QQuaternion &quaternion)
QQuaternion operator+(const QQuaternion &q1, const QQuaternion &q2)
QQuaternion operator-(const QQuaternion &quaternion)
QQuaternion operator-(const QQuaternion &q1, const QQuaternion &q2)
QQuaternion operator/(const QQuaternion &quaternion, float divisor)
QDataStream &operator<<(QDataStream &stream, const QQuaternion &quaternion)
bool operator==(const QQuaternion &q1, const QQuaternion &q2)
QDataStream &operator>>(QDataStream &stream, QQuaternion &quaternion)

详细说明

四元数用于表示三维空间中的旋转,由 x、y 和 z 坐标指定的三维旋转轴以及表示旋转角度的标量组成。

成员函数文档

[constexpr noexcept] QQuaternion::QQuaternion()

构造一个同位四元数 (1,0,0,0),即矢量 (0, 0, 0) 和标量 1。

[explicit constexpr noexcept] QQuaternion::QQuaternion(const QVector4D &vector)

根据vector 的分量构造一个四元数。

[constexpr noexcept] QQuaternion::QQuaternion(float scalar, const QVector3D &vector)

根据指定的vectorscalar 构建四元数向量。

另请参阅 vector() 和scalar() 。

[constexpr noexcept] QQuaternion::QQuaternion(float scalar, float xpos, float ypos, float zpos)

用矢量 (xpos,ypos,zpos) 和scalar 构建一个四元数。

[constexpr noexcept] QQuaternion QQuaternion::conjugated() const

返回此四元数的共轭值,即 (-x、-y、-z、标量)。

[static constexpr noexcept] float QQuaternion::dotProduct(const QQuaternion &q1, const QQuaternion &q2)

返回q1q2 的点积。

另请参见 length().

[static] QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis)

使用 3 个轴 (xAxis,yAxis,zAxis) 构建四元数。

注: 假设轴是正交的。

另请参见 getAxes() 和fromRotationMatrix() 。

[static] QQuaternion QQuaternion::fromAxisAndAngle(const QVector3D &axis, float angle)

创建一个归一化四元数,对应于围绕指定 3Daxis 旋转angle 度。

另请参阅 getAxisAndAngle().

[static] QQuaternion QQuaternion::fromAxisAndAngle(float x, float y, float z, float angle)

创建一个归一化四元数,对应于围绕三维轴旋转angle 度 (x,y,z)。

另请参见 getAxisAndAngle().

[static] QQuaternion QQuaternion::fromDirection(const QVector3D &direction, const QVector3D &up)

使用指定的前进方向direction 和向上方向up 构建四元数。如果没有指定向上方向,或者前向矢量和向上矢量相交,则会生成一个新的正交向上方向。

另请参见 fromAxes() 和rotationTo() 。

[static] QQuaternion QQuaternion::fromEulerAngles(float pitch, float yaw, float roll)

创建一个四元数,对应于绕 Z 轴旋转roll 度、绕 X 轴旋转pitch 度和绕 Y 轴旋转yaw 度(依次类推)。

另请参阅 getEulerAngles().

[static] QQuaternion QQuaternion::fromEulerAngles(const QVector3D &eulerAngles)

这是一个重载函数。

创建一个四元数,对应于eulerAngles 的旋转:绕 Z 轴旋转 eulerAngles.z() 度,绕 X 轴旋转 eulerAngles.x() 度,绕 Y 轴旋转 eulerAngles.y() 度(依次类推)。

另请参阅 toEulerAngles() 。

[static] QQuaternion QQuaternion::fromRotationMatrix(const QMatrix3x3 &rot3x3)

创建与旋转矩阵rot3x3 相对应的四元数。

注: 如果给定的旋转矩阵未进行归一化处理,生成的四元数将包含缩放信息。

另请参阅 toRotationMatrix() 和fromAxes() 。

void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const

返回定义四元数的 3 个正交轴 (xAxis,yAxis,zAxis)。

另请参阅 fromAxes() 和toRotationMatrix() 。

void QQuaternion::getAxisAndAngle(float *x, float *y, float *z, float *angle) const

提取三维轴 (x,y,z) 和与此四元数相对应的旋转角度angle (单位:度)。

另请参见 fromAxisAndAngle().

void QQuaternion::getAxisAndAngle(QVector3D *axis, float *angle) const

这是一个重载函数。

提取与该四元数相对应的三维轴axis 和旋转角度angle (单位:度)。

另请参见 fromAxisAndAngle().

void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const

计算与此四元数对应的roll,pitch, 和yaw 欧拉角(以度为单位)。

另请参见 fromEulerAngles().

[constexpr noexcept] QQuaternion QQuaternion::inverted() const

返回此四元数的逆值。如果此四元数为空,则返回一个空四元数。

另请参阅 isNull() 和length()。

[constexpr noexcept] bool QQuaternion::isIdentity() const

如果此四元数的 x、y 和 z 分量设置为 0.0,标量分量设置为 1.0,则返回true ;否则返回false

[constexpr noexcept] bool QQuaternion::isNull() const

如果此四元数的 x、y、z 和标量分量设置为 0.0,则返回true ;否则返回false

float QQuaternion::length() const

返回四元数的长度。这也称为 "规范"。

另请参见 lengthSquared()、normalized() 和dotProduct()。

float QQuaternion::lengthSquared() const

返回四元数的平方长度。

注意: 虽然计算成本很低,但容易出现溢出和下溢,而length() 在很多情况下都能避免这种情况。

另请参阅 length() 和dotProduct()。

[static] QQuaternion QQuaternion::nlerp(const QQuaternion &q1, const QQuaternion &q2, float t)

沿旋转位置q1q2 之间的最短线性路径进行插值。t 的值应在 0 和 1 之间,表示q1q2 之间的距离。结果将是normalized() 。

如果t 小于或等于 0,则将返回q1 。如果t 大于或等于 1,则将返回q2

nlerp()函数通常比slerp() 更快,并能给出球面插值的近似结果,足以满足某些应用的需要。

另请参见 slerp()。

void QQuaternion::normalize()

将当前的四元数归一化。如果是空四元数或四元数的长度非常接近 1,则不会发生任何操作。

另请参见 length() 和normalized()。

QQuaternion QQuaternion::normalized() const

返回此四元数的归一化单位形式。

如果此四元数为空,则返回空四元数。如果四元数的长度非常接近 1,则将按原样返回四元数。否则,将返回长度为 1 的四元数的规范化形式。

另请参见 normalize()、length() 和dotProduct()。

QVector3D QQuaternion::rotatedVector(const QVector3D &vector) const

用这个四元数旋转vector ,在三维空间中生成一个新的矢量。以下代码

QVector3D result = q.rotatedVector(vector);

相当于以下代码:

QVector3D result = (q * QQuaternion(0, vector) * q.conjugated()).vector();

[static] QQuaternion QQuaternion::rotationTo(const QVector3D &from, const QVector3D &to)

返回从向量from 所描述的方向旋转到向量to 所描述的方向的最短弧四元数。

另请参见 fromDirection().

[constexpr noexcept] float QQuaternion::scalar() const

返回此四元数的标量分量。

另请参见 setScalar()、x()、y() 和z()。

[constexpr noexcept] void QQuaternion::setScalar(float scalar)

将此四元数的标量分量设置为scalar

另请参见 scalar()、setX()、setY() 和setZ() 。

[constexpr noexcept] void QQuaternion::setVector(const QVector3D &vector)

将此四元数的矢量分量设置为vector

另请参见 vector() 和setScalar()。

[constexpr noexcept] void QQuaternion::setVector(float x, float y, float z)

将此四元数的矢量分量设置为 (x,y,z)。

另请参见 vector() 和setScalar()。

[constexpr noexcept] void QQuaternion::setX(float x)

将此四元数向量的 x 坐标设置为给定的x 坐标。

另请参阅 x()、setY()、setZ() 和setScalar()。

[constexpr noexcept] void QQuaternion::setY(float y)

将此四元数矢量的 y 坐标设置为给定的y 坐标。

另请参阅 y()、setX()、setZ() 和setScalar()。

[constexpr noexcept] void QQuaternion::setZ(float z)

将此四元数矢量的 Z 坐标设置为给定的z 坐标。

另请参见 z()、setX()、setY() 和setScalar()。

[static] QQuaternion QQuaternion::slerp(const QQuaternion &q1, const QQuaternion &q2, float t)

沿旋转位置q1q2 之间的最短球面路径进行内插。t 的值应在 0 和 1 之间,表示q1q2 之间的球面距离。

如果t 小于或等于 0,则将返回q1 。如果t 大于或等于 1,则将返回q2

另请参阅 nlerp() 。

QVector3D QQuaternion::toEulerAngles() const

这是一个重载函数。

计算与此四元数相对应的滚转、俯仰和偏航欧拉角(以度为单位)。

另请参见 fromEulerAngles().

QMatrix3x3 QQuaternion::toRotationMatrix() const

创建与此四元数相对应的旋转矩阵。

注意: 如果此四元数未进行归一化处理,生成的旋转矩阵将包含缩放信息。

另请参阅 fromRotationMatrix() 和getAxes()。

[constexpr noexcept] QVector4D QQuaternion::toVector4D() const

将此四元数作为 4D 向量返回。

[constexpr noexcept] QVector3D QQuaternion::vector() const

返回此四元数的矢量分量。

另请参阅 setVector() 和scalar()。

[constexpr noexcept] float QQuaternion::x() const

返回此四元数向量的 x 坐标。

另请参见 setX()、y()、z() 和scalar()。

[constexpr noexcept] float QQuaternion::y() const

返回此四元数矢量的 Y 坐标。

另请参见 setY()、x()、z() 和scalar()。

[constexpr noexcept] float QQuaternion::z() const

返回此四元数向量的 Z 坐标。

另请参见 setZ()、x()、y() 和scalar()。

QVariant QQuaternion::operator QVariant() const

QVariant 的形式返回四元数。

[constexpr noexcept] QQuaternion &QQuaternion::operator*=(const QQuaternion &quaternion)

将此四元数乘以quaternion ,并返回此四元数的引用。

[constexpr noexcept] QQuaternion &QQuaternion::operator*=(float factor)

将此四元数的分量与给定的factor 相乘,并返回此四元数的引用。

另请参见 operator/=().

[constexpr noexcept] QQuaternion &QQuaternion::operator+=(const QQuaternion &quaternion)

将给定的quaternion 添加到此四元数中,并返回此四元数的引用。

另请参见 operator-=().

[constexpr noexcept] QQuaternion &QQuaternion::operator-=(const QQuaternion &quaternion)

从四元数中减去给定的quaternion ,并返回对该四元数的引用。

另请参见 operator+=().

[constexpr] QQuaternion &QQuaternion::operator/=(float divisor)

将此四元数的分量除以给定的divisor ,并返回此四元数的引用。

另请参阅 operator*=() 。

相关非成员

[constexpr noexcept] bool qFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2)

如果q1q2 相等,则返回true ,允许在浮点比较中使用较小的模糊系数;否则返回 false。

[constexpr noexcept] bool operator!=(const QQuaternion &q1, const QQuaternion &q2)

如果q1 不等于q2 ,则返回true ;否则返回false 。该运算符使用精确浮点比较法。

[constexpr noexcept] QQuaternion operator*(const QQuaternion &q1, const QQuaternion &q2)

使用四元数乘法将q1q2 相乘。其结果相当于应用q1q2 指定的两个旋转。

另请参见 QQuaternion::operator*=().

QVector3D operator*(const QQuaternion &quaternion, const QVector3D &vec)

用四元数quaternion 旋转矢量vec ,生成三维空间中的新矢量。

[constexpr noexcept] QQuaternion operator*(const QQuaternion &quaternion, float factor)

返回给定quaternion 乘以给定factor 的副本。

另请参见 QQuaternion::operator*=()。

[constexpr noexcept] QQuaternion operator*(float factor, const QQuaternion &quaternion)

返回给定quaternion 乘以给定factor 的副本。

另请参见 QQuaternion::operator*=()。

[constexpr noexcept] QQuaternion operator+(const QQuaternion &q1, const QQuaternion &q2)

返回一个QQuaternion 对象,它是给定的四元数q1q2 的总和;每个分量分别相加。

另请参见 QQuaternion::operator+=()。

[constexpr noexcept] QQuaternion operator-(const QQuaternion &quaternion)

这是一个重载函数。

返回QQuaternion 对象,该对象是通过改变给定quaternion 的所有三个分量的符号形成的。

等价于QQuaternion(0,0,0,0) - quaternion

[constexpr noexcept] QQuaternion operator-(const QQuaternion &q1, const QQuaternion &q2)

返回一个QQuaternion 对象,该对象由q2q1 相减而得,每个部分分别相减。

另请参阅 QQuaternion::operator-=().

[constexpr] QQuaternion operator/(const QQuaternion &quaternion, float divisor)

返回QQuaternion 对象,该对象由给定的quaternion 的所有分量除以给定的divisor 形成。

另请参见 QQuaternion::operator/=()。

QDataStream &operator<<(QDataStream &stream, const QQuaternion &quaternion)

将给定的quaternion 写入给定的stream ,并返回对该数据流的引用。

另请参阅 序列化 Qt 数据类型

[constexpr noexcept] bool operator==(const QQuaternion &q1, const QQuaternion &q2)

如果q1 等于q2 ,则返回true ;否则返回false 。该运算符使用精确浮点比较法。

QDataStream &operator>>(QDataStream &stream, QQuaternion &quaternion)

将四元数从给定的stream 读取到给定的quaternion ,并返回对该数据流的引用。

另请参阅 序列化 Qt 数据类型

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.