QMatrix4x4 Class

QMatrix4x4 类表示三维空间中的 4x4 变换矩阵。更多

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

公共类型

flags Flags

公共函数

QMatrix4x4()
QMatrix4x4(const QGenericMatrix<N, M, float> &matrix)
QMatrix4x4(const QTransform &transform)
QMatrix4x4(const float *values)
QMatrix4x4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)
QVector4D column(int index) const
const float *constData() const
void copyDataTo(float *values) const
float *data()
const float *data() const
double determinant() const
void fill(float value)
void frustum(float left, float right, float bottom, float top, float nearPlane, float farPlane)
QMatrix4x4 inverted(bool *invertible = nullptr) const
bool isAffine() const
bool isIdentity() const
void lookAt(const QVector3D &eye, const QVector3D &center, const QVector3D &up)
QPoint map(const QPoint &point) const
QPointF map(const QPointF &point) const
QVector3D map(const QVector3D &point) const
QVector4D map(const QVector4D &point) const
QRect mapRect(const QRect &rect) const
QRectF mapRect(const QRectF &rect) const
QVector3D mapVector(const QVector3D &vector) const
QMatrix3x3 normalMatrix() const
void optimize()
void ortho(float left, float right, float bottom, float top, float nearPlane, float farPlane)
void ortho(const QRect &rect)
void ortho(const QRectF &rect)
void perspective(float verticalAngle, float aspectRatio, float nearPlane, float farPlane)
void rotate(const QQuaternion &quaternion)
void rotate(float angle, const QVector3D &vector)
void rotate(float angle, float x, float y, float z = 0.0f)
QVector4D row(int index) const
void scale(const QVector3D &vector)
void scale(float factor)
void scale(float x, float y)
void scale(float x, float y, float z)
void setColumn(int index, const QVector4D &value)
void setRow(int index, const QVector4D &value)
void setToIdentity()
QGenericMatrix<N, M, float> toGenericMatrix() const
QTransform toTransform() const
QTransform toTransform(float distanceToPlane) const
void translate(const QVector3D &vector)
void translate(float x, float y)
void translate(float x, float y, float z)
QMatrix4x4 transposed() const
void viewport(float left, float bottom, float width, float height, float nearPlane = 0.0f, float farPlane = 1.0f)
void viewport(const QRectF &rect)
QVariant operator QVariant() const
bool operator!=(const QMatrix4x4 &other) const
float &operator()(int row, int column)
const float &operator()(int row, int column) const
QMatrix4x4 &operator*=(const QMatrix4x4 &other)
QMatrix4x4 &operator*=(float factor)
QMatrix4x4 &operator+=(const QMatrix4x4 &other)
QMatrix4x4 &operator-=(const QMatrix4x4 &other)
QMatrix4x4 &operator/=(float divisor)
bool operator==(const QMatrix4x4 &other) const
bool qFuzzyCompare(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QMatrix4x4 operator*(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QVector4D operator*(const QMatrix4x4 &matrix, const QVector4D &vector)
QMatrix4x4 operator*(const QMatrix4x4 &matrix, float factor)
QPoint operator*(const QPoint &point, const QMatrix4x4 &matrix)
QPointF operator*(const QPointF &point, const QMatrix4x4 &matrix)
QVector4D operator*(const QVector4D &vector, const QMatrix4x4 &matrix)
QMatrix4x4 operator*(float factor, const QMatrix4x4 &matrix)
QMatrix4x4 operator+(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QMatrix4x4 operator-(const QMatrix4x4 &matrix)
QMatrix4x4 operator-(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QMatrix4x4 operator/(const QMatrix4x4 &matrix, float divisor)
QDataStream &operator<<(QDataStream &stream, const QMatrix4x4 &matrix)
QDataStream &operator>>(QDataStream &stream, QMatrix4x4 &matrix)

详细说明

QMatrix4x4 类一般被视为行主矩阵,其构造函数和operator() 函数以行主格式获取数据,这在 C 风格的使用中很常见。

在内部,数据以列主格 式存储,以便传递给 OpenGL 函数(这些函数需要列主格数据)。

使用这些函数时,请注意它们返回的数据是主列格式:

另请参阅 QVector3DQGenericMatrix

成员函数文档

QMatrix4x4::QMatrix4x4()

构造一个身份矩阵。

[explicit] template <int N, int M> QMatrix4x4::QMatrix4x4(const QGenericMatrix<N, M, float> &matrix)

matrix 的最左 4 列和最上 4 行构建一个 4x4 矩阵。如果matrix 的列数或行数少于 4,剩余元素将由来自同一性矩阵的元素填充。

另请参见 toGenericMatrix().

QMatrix4x4::QMatrix4x4(const QTransform &transform)

从传统的 Qt XML 2D 变换矩阵transform 构造一个 4x4 矩阵。

如果transform 具有特殊类型(identity、translate、scale 等),程序员希望 QMatrix4x4 优化对translate() 和scale() 等的进一步调用,则应在该构造函数之后调用optimize() 。

另请参阅 toTransform() 和optimize()。

[explicit] QMatrix4x4::QMatrix4x4(const float *values)

用给定的 16 个浮点values 构建矩阵。假定数组values 的内容按行-主顺序排列。

如果矩阵具有特殊类型(同位、平移、缩放等),程序员希望 QMatrix4x4 优化对translate(),scale() 等的进一步调用,则应在该构造函数后调用optimize() 。

另请参阅 copyDataTo() 和optimize()。

QMatrix4x4::QMatrix4x4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)

从 16 个元素构建一个矩阵m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43, 和m44 。元素按行-主序排列。

如果矩阵具有特殊类型(同一、平移、缩放等),程序员希望 QMatrix4x4 优化对translate(),scale() 等的进一步调用,则应在该构造函数之后调用optimize() 。

另请参见 optimize()。

QVector4D QMatrix4x4::column(int index) const

以 4D 向量形式返回index 列的元素。

另请参见 setColumn() 和row()。

const float *QMatrix4x4::constData() const

返回指向该矩阵原始数据的常量指针。原始数据以列-主格式存储。

另请参见 data()。

void QMatrix4x4::copyDataTo(float *values) const

读取该矩阵中的 16 个项目,并按行-主顺序将其复制到values

float *QMatrix4x4::data()

返回指向此矩阵原始数据的指针。

另请参阅 constData() 和optimize()。

const float *QMatrix4x4::data() const

返回指向该矩阵原始数据的常量指针。原始数据以列-主格式存储。

另请参见 constData()。

double QMatrix4x4::determinant() const

返回此矩阵的行列式。

void QMatrix4x4::fill(float value)

value 填充 matrx 的所有元素。

void QMatrix4x4::frustum(float left, float right, float bottom, float top, float nearPlane, float farPlane)

将此矩阵与另一个矩阵相乘,该矩阵应用了一个窗口的透视顿挫投影,该窗口具有左下角 (left,bottom) 、右上角 (right,top) 和指定的nearPlanefarPlane 剪贴平面。

另请参阅 ortho() 和perspective()。

QMatrix4x4 QMatrix4x4::inverted(bool *invertible = nullptr) const

返回矩阵的逆值。如果矩阵无法反转,即determinant() 为零,则返回同一值。如果invertible 不是空值,那么如果矩阵可以反转,则会向该位置写入 true;否则写入 false。

如果矩阵被识别为标识矩阵或正交矩阵,那么此函数将使用优化例程快速反转矩阵。

另请参见 determinant() 和normalMatrix()。

bool QMatrix4x4::isAffine() const

如果此矩阵是仿射矩阵,则返回true ;否则返回 false。

仿射矩阵是第 3 行等于 (0, 0, 0, 1) 的 4x4 矩阵,例如没有投影系数。

另请参见 isIdentity()。

bool QMatrix4x4::isIdentity() const

如果该矩阵是同一矩阵,则返回true ;否则返回 false。

另请参见 setToIdentity().

void QMatrix4x4::lookAt(const QVector3D &eye, const QVector3D &center, const QVector3D &up)

将此矩阵与从眼点得出的观察矩阵相乘。center 值表示eye 正在观察的视图中心。up 值表示相对于eye 应向上考虑的方向。

注: up 向量不得与eyecenter 的视线平行。

QPoint QMatrix4x4::map(const QPoint &point) const

通过将该矩阵乘以point ,映射point 。矩阵在点前应用。

另请参见 mapRect()。

QPointF QMatrix4x4::map(const QPointF &point) const

映射point ,将该矩阵与point 后乘。矩阵在点前应用。

另请参见 mapRect()。

QVector3D QMatrix4x4::map(const QVector3D &point) const

地图point 通过将该矩阵乘以point 扩展为 4D 向量,假定 w 坐标为 1.0。矩阵在点前应用。

注: 此函数与mapVector() 不同。对于点,始终使用 map()。mapVector() 仅适用于矢量(方向)。

另请参见 mapRect() 和mapVector()。

QVector4D QMatrix4x4::map(const QVector4D &point) const

通过将该矩阵乘以point ,映射point 。矩阵在点前应用。

另请参见 mapRect()。

QRect QMatrix4x4::mapRect(const QRect &rect) const

映射rect ,方法是将此矩阵与rect 的角相乘,然后根据结果形成一个新的矩形。返回的矩形将是一个普通的二维矩形,其边线与水平轴和垂直轴平行。

另请参见 map()。

QRectF QMatrix4x4::mapRect(const QRectF &rect) const

映射rect ,方法是将此矩阵与rect 的角相乘,然后根据结果形成一个新的矩形。返回的矩形将是一个普通的二维矩形,其边线与水平轴和垂直轴平行。

另请参见 map()。

QVector3D QMatrix4x4::mapVector(const QVector3D &vector) const

地图vector ,方法是将该矩阵的顶部 3x3 部分乘以vector 。该矩阵的平移和投影部分将被忽略。矩阵应用了预向量。

另请参见 map()。

QMatrix3x3 QMatrix4x4::normalMatrix() const

返回与此 4x4 变换相对应的法向量矩阵。法矩阵是该 4x4 矩阵左上方 3x3 部分的逆的转置。如果 3x3 子矩阵不可反转,则此函数返回同一值。

另请参见 inverted()。

void QMatrix4x4::optimize()

根据矩阵的当前元素优化矩阵的使用。

如果已知被修改的矩阵是同一矩阵、先前的translate() 和先前的scale() 等,则可以更高效地执行translate() 、scale() 和rotate() 等操作。

通常,QMatrix4x4 类在执行操作时会在内部跟踪这种特殊类型。但是,如果直接使用operator()(int, int) 或data() 对矩阵进行修改,QMatrix4x4 就会失去对特殊类型的跟踪,并恢复到最安全但效率最低的操作。

在直接修改矩阵后调用 optimize(),如果元素看起来符合已知的优化类型之一,程序员可以强制QMatrix4x4 恢复特殊类型。

另请参见 operator()(int, int)、data() 和translate()。

void QMatrix4x4::ortho(float left, float right, float bottom, float top, float nearPlane, float farPlane)

将该矩阵与另一个矩阵相乘,该矩阵应用了一个窗口的正投影,该窗口具有左下角 (left,bottom) 、右上角 (right,top) 和指定的nearPlanefarPlane 剪贴平面。

另请参阅 frustum() 和perspective()。

void QMatrix4x4::ortho(const QRect &rect)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,该矩阵对一个窗口进行正投影,窗口的边界由rect 指定。近剪切平面和远剪切平面的值分别为-1 和 1。

另请参见 frustum() 和perspective()。

void QMatrix4x4::ortho(const QRectF &rect)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,该矩阵对一个窗口进行正投影,窗口的边界由rect 指定。近剪切平面和远剪切平面的值分别为-1 和 1。

另请参见 frustum() 和perspective()。

void QMatrix4x4::perspective(float verticalAngle, float aspectRatio, float nearPlane, float farPlane)

将此矩阵与另一个应用透视投影的矩阵相乘。垂直视场将在一个窗口内verticalAngle 度,该窗口的给定aspectRatio 决定了水平视场。该投影将具有指定的nearPlanefarPlane 剪贴平面,也就是从观察者到相应平面的距离。

另请参阅 ortho() 和frustum()。

void QMatrix4x4::rotate(const QQuaternion &quaternion)

将此矩阵乘以另一个矩阵,后者根据指定的quaternion 旋转坐标。假定quaternion 已归一化。

另请参阅 scale(),translate() 和QQuaternion

void QMatrix4x4::rotate(float angle, const QVector3D &vector)

将该矩阵乘以另一个矩阵,该矩阵将坐标围绕vector 旋转angle 度。

另请参见 scale() 和translate()。

void QMatrix4x4::rotate(float angle, float x, float y, float z = 0.0f)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者将坐标围绕向量 (x,y,z) 旋转angle 度。

另请参见 scale() 和translate() 。

QVector4D QMatrix4x4::row(int index) const

以 4D 向量形式返回行index 中的元素。

另请参阅 setRow() 和column()。

void QMatrix4x4::scale(const QVector3D &vector)

将此矩阵与另一个矩阵相乘,后者按vector 的分量缩放坐标。

另请参见 translate() 和rotate()。

void QMatrix4x4::scale(float factor)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者按给定的factor 对坐标进行缩放。

另请参见 translate() 和rotate() 。

void QMatrix4x4::scale(float x, float y)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者通过xy 对坐标进行缩放。

另请参见 translate() 和rotate()。

void QMatrix4x4::scale(float x, float y, float z)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者按xyz 的分量缩放坐标。

另请参见 translate() 和rotate()。

void QMatrix4x4::setColumn(int index, const QVector4D &value)

index 列的元素设置为value 的组件。

另请参阅 column() 和setRow()。

void QMatrix4x4::setRow(int index, const QVector4D &value)

index 行的元素设置为value 行的元素。

另请参阅 row() 和setColumn()。

void QMatrix4x4::setToIdentity()

将此矩阵设置为同一值。

另请参见 isIdentity().

template <int N, int M> QGenericMatrix<N, M, float> QMatrix4x4::toGenericMatrix() const

用该 4x4 矩阵最左边的 N 列和最上面的 M 行构建一个 NxM 的通用矩阵。如果 N 或 M 大于 4,则其余元素将由来自同一矩阵的元素填充。

QTransform QMatrix4x4::toTransform() const

返回与此矩阵相对应的传统 Qt 2D 变换矩阵。

返回的QTransform 是通过简单去掉QMatrix4x4 的第三行和第三列形成的。这适用于实现正交投影,在这种情况下,z 坐标应被去掉而不是投影。

QTransform QMatrix4x4::toTransform(float distanceToPlane) const

返回与此矩阵相对应的传统 Qt 2D 变换矩阵。

如果distanceToPlane 非零,则表示用于调整 Z 坐标的投影系数。1024 的值对应于QTransform::rotate() 用于 x 轴和 y 轴的投影因子。

如果distanceToPlane 为零,那么返回的QTransform 就是去掉QMatrix4x4 的第三行和第三列而形成的。这适用于需要去掉而不是投影 Z 坐标的正交投影。

void QMatrix4x4::translate(const QVector3D &vector)

将此矩阵与另一个矩阵相乘,后者通过vector 的分量转换坐标。

另请参见 scale() 和rotate()。

void QMatrix4x4::translate(float x, float y)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者通过xy 转换坐标。

另请参见 scale() 和rotate() 。

void QMatrix4x4::translate(float x, float y, float z)

这是一个重载函数。

将此矩阵与另一个矩阵相乘,后者通过xyz 三个分量转换坐标。

另请参见 scale() 和rotate()。

QMatrix4x4 QMatrix4x4::transposed() const

返回该矩阵的对角线转置。

void QMatrix4x4::viewport(float left, float bottom, float width, float height, float nearPlane = 0.0f, float farPlane = 1.0f)

将此矩阵与另一个矩阵相乘,执行 OpenGL 所使用的缩放和偏置变换,将归一化设备坐标(NDC)转换为视口(窗口)坐标。也就是说,它将立方体中每个维度范围为 [-1, 1] 的点映射到视口,视口的近左下角位于 (left,bottom,nearPlane) ,大小为 (width,height,farPlane -nearPlane) 。

这与由函数 glViewport() 和 glDepthRange() 控制的固定函数 OpenGL 视口变换所使用的变换一致。

void QMatrix4x4::viewport(const QRectF &rect)

这是一个重载函数。

为以rect 为边界的视口设置视口变换,近景和远景分别设置为 0 和 1。

QVariant QMatrix4x4::operator QVariant() const

QVariant 的形式返回矩阵。

bool QMatrix4x4::operator!=(const QMatrix4x4 &other) const

如果此矩阵与other 不相同,则返回true ;否则返回 false。此运算符使用精确浮点比较法。

float &QMatrix4x4::operator()(int row, int column)

返回该矩阵中位于 (row,column) 位置的元素的引用,以便对该元素进行赋值。

另请参阅 optimize()、setColumn() 和setRow()。

const float &QMatrix4x4::operator()(int row, int column) const

返回该矩阵中位于 (row,column) 位置的元素的常量引用。

另请参阅 column() 和row()。

QMatrix4x4 &QMatrix4x4::operator*=(const QMatrix4x4 &other)

other 的内容与该矩阵相乘。

QMatrix4x4 &QMatrix4x4::operator*=(float factor)

这是一个重载函数。

将此矩阵的所有元素与factor 相乘。

QMatrix4x4 &QMatrix4x4::operator+=(const QMatrix4x4 &other)

other 的内容添加到此矩阵中。

QMatrix4x4 &QMatrix4x4::operator-=(const QMatrix4x4 &other)

从该矩阵中减去other 的内容。

QMatrix4x4 &QMatrix4x4::operator/=(float divisor)

这是一个重载函数。

将此矩阵的所有元素除以divisor

bool QMatrix4x4::operator==(const QMatrix4x4 &other) const

如果此矩阵与other 相同,则返回true ;否则返回 false。此操作符使用精确浮点比较。

相关非成员

[noexcept] bool qFuzzyCompare(const QMatrix4x4 &m1, const QMatrix4x4 &m2)

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

QMatrix4x4 operator*(const QMatrix4x4 &m1, const QMatrix4x4 &m2)

返回m1m2 的乘积。

QVector4D operator*(const QMatrix4x4 &matrix, const QVector4D &vector)

返回根据matrixvector 进行转换的结果,并应用矩阵预向量。

QMatrix4x4 operator*(const QMatrix4x4 &matrix, float factor)

返回matrix 中所有元素乘以factor 的结果。

QPoint operator*(const QPoint &point, const QMatrix4x4 &matrix)

返回根据matrixpoint 进行变换的结果,并在变换后应用矩阵。

QPointF operator*(const QPointF &point, const QMatrix4x4 &matrix)

返回根据matrixpoint 进行变换的结果,并在变换后应用矩阵。

QVector4D operator*(const QVector4D &vector, const QMatrix4x4 &matrix)

返回根据matrixvector 进行转换的结果,并应用矩阵后向量。

QMatrix4x4 operator*(float factor, const QMatrix4x4 &matrix)

返回matrix 中所有元素乘以factor 的结果。

QMatrix4x4 operator+(const QMatrix4x4 &m1, const QMatrix4x4 &m2)

返回m1m2 之和。

QMatrix4x4 operator-(const QMatrix4x4 &matrix)

这是一个重载函数。

返回matrix 的否定值。

QMatrix4x4 operator-(const QMatrix4x4 &m1, const QMatrix4x4 &m2)

返回m1m2 的差值。

QMatrix4x4 operator/(const QMatrix4x4 &matrix, float divisor)

返回matrix 中所有元素除以divisor 的结果。

QDataStream &operator<<(QDataStream &stream, const QMatrix4x4 &matrix)

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

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

QDataStream &operator>>(QDataStream &stream, QMatrix4x4 &matrix)

将一个 4x4 矩阵从给定的stream 读入给定的matrix ,并返回对该数据流的引用。

另请参阅 序列化 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.