「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「QT」QT5程序设计 | ||
📚全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
「Math」探秘数学世界 |
目录
- Qt中QMatrix4x4类的深度解析
- 一、类的引言
- 二、使用范围
- 三、类的头文件
- 四、类的构造介绍
- 五、共有函数介绍
- 六、Static函数介绍
- 七、运算符重载
- 八、详细代码举例
Qt中QMatrix4x4类的深度解析
一、类的引言
QMatrix4x4是Qt框架中的一个核心类,专门用于表示和操作4x4的浮点矩阵。在计算机图形学领域,矩阵变换是实现三维图形变换的关键技术,它允许开发者在三维空间中执行平移、旋转、缩放等几何操作。QMatrix4x4类封装了这些复杂的数学运算,为Qt应用程序中的图形渲染和变换提供了强大的支持。
官方文档链接:https://doc.qt.io/qt-5/qmatrix4x4.html
二、使用范围
QMatrix4x4类广泛应用于各种需要三维图形变换的场景,包括但不限于:
- 游戏开发:用于实现游戏角色、物体和场景的变换效果。
- 三维建模:在三维建模软件中,用于调整模型的姿态和位置。
- 虚拟现实:在虚拟现实应用中,用于构建逼真的三维场景和交互体验。
- 动画渲染:在动画软件中,用于实现物体的平滑动画效果。
三、类的头文件
QMatrix4x4类的头文件是<QMatrix4x4>
。在使用QMatrix4x4类之前,需要在源文件中包含这个头文件:
#include <QMatrix4x4>
四、类的构造介绍
QMatrix4x4类提供了多种构造函数,允许开发者以不同的方式初始化矩阵。以下是几个常用的构造函数:
- 默认构造函数:
QMatrix4x4()
,构造一个单位矩阵。 - 数组初始化构造函数:
QMatrix4x4(const float *values)
,使用给定的浮点数组初始化矩阵。 - 逐个元素初始化构造函数:
QMatrix4x4(float m11, float m12, ..., float m44)
,使用16个浮点值初始化矩阵。 - 从QTransform转换构造函数:
QMatrix4x4(const QTransform &transform)
,将Qt的2D变换矩阵转换为4x4矩阵。
五、共有函数介绍
QMatrix4x4类提供了丰富的共有函数,用于操作矩阵和执行各种变换。以下是一些常用的函数:
- 设置为单位矩阵:
void setToIdentity()
,将矩阵重置为单位矩阵。 - 平移变换:
QMatrix4x4 &translate(float dx, float dy, float dz)
,在X、Y、Z方向上平移矩阵。 - 缩放变换:
QMatrix4x4 &scale(float sx, float sy, float sz)
,按照指定的比例缩放矩阵。 - 旋转变换:
QMatrix4x4 &rotate(float angle, const QVector3D &vector)
,按照指定的角度和轴进行旋转变换。 - 透视投影:
QMatrix4x4 &perspective(float nearPlane, float farPlane)
,设置透视投影矩阵。 - 映射点:
QVector3D map(const QVector3D &point)
,将给定的三维点应用矩阵变换。 - 计算逆矩阵:
QMatrix4x4 inverted(bool *invertible = nullptr) const
,计算并返回矩阵的逆矩阵。
六、Static函数介绍
QMatrix4x4类还提供了一些静态函数,这些函数不依赖于特定的矩阵实例,而是对整个类进行操作。然而,在QMatrix4x4的官方文档中,并没有明确列出静态函数,因此这里不做详细介绍。如果未来Qt框架对QMatrix4x4类进行了扩展并添加了静态函数,开发者可以参考最新的Qt文档以获取更多信息。
七、运算符重载
QMatrix4x4类重载了一些运算符,以便更方便地进行矩阵运算和比较。以下是一些常用的运算符重载:
- 乘法赋值运算符:
QMatrix4x4 &operator*=(const QMatrix4x4 &other)
,将当前矩阵与另一个矩阵相乘并赋值给当前矩阵。 - 标量乘法赋值运算符:
QMatrix4x4 &operator*=(float factor)
,将当前矩阵与标量相乘并赋值给当前矩阵。 - 加法赋值运算符:
QMatrix4x4 &operator+=(const QMatrix4x4 &other)
,将当前矩阵与另一个矩阵相加并赋值给当前矩阵。 - 减法赋值运算符:
QMatrix4x4 &operator-=(const QMatrix4x4 &other)
,将当前矩阵与另一个矩阵相减并赋值给当前矩阵。 - 标量除法赋值运算符:
QMatrix4x4 &operator/=(float divisor)
,将当前矩阵与标量相除并赋值给当前矩阵。
此外,QMatrix4x4类还重载了比较运算符(==
和!=
)和索引运算符(operator()
),以便更方便地比较矩阵元素和访问矩阵元素。
八、详细代码举例
以下是一个使用QMatrix4x4类的详细代码示例,展示了如何创建一个矩阵、进行平移、旋转和缩放操作,并将变换应用到一个三维点上:
#include <QMatrix4x4>
#include <QVector3D>
#include <QDebug>int main() {// 创建一个单位矩阵QMatrix4x4 matrix;// 平移矩阵,将原点移动到(2, 3, 4)matrix.translate(2.0f, 3.0f, 4.0f);// 旋转矩阵,绕Z轴旋转45度matrix.rotate(45.0f, QVector3D(0, 0, 1));// 缩放矩阵,按照(1.5, 1.5, 1.5)的比例进行缩放matrix.scale(1.5f, 1.5f, 1.5f);// 创建一个三维点(1, 1, 1)QVector3D point(1.0f, 1.0f, 1.0f);// 将变换应用到点上,并获取变换后的点QVector3D transformedPoint = matrix.map(point);// 输出变换后的点的坐标qDebug() << "Transformed Point:" << transformedPoint;return 0;
}
在这个示例中,我们首先创建了一个单位矩阵,然后依次进行了平移、旋转和缩放操作。接着,我们创建了一个三维点,并使用map
函数将变换应用到该点上。最后,我们输出了变换后的点的坐标。
通过QMatrix4x4类,我们可以轻松地在Qt应用程序中实现复杂的三维变换和图形效果。希望这篇文章能够帮助你更好地理解和使用QMatrix4x4类。
相关文章:

「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

让Apache正确处理不同编码的文件避免中文乱码
安装了apache2.4.39以后,默认编码是UTF-8,不管你文件是什么编码,统统按这个来解析,因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…...

人员密集场所遇到突发火灾事故该如何应对
0引言 在繁华喧嚣的都市中,人员密集场所如购物中心、电影院、办公楼等,是人们日常生活不可或缺的一部分。然而,在这些看似繁华的背后,隐藏着不可忽视的安全隐患——火灾。火灾无情,往往在不经意间爆发,瞬间…...

使用QtWebEngine的Mac应用如何发布App Store
前言 因为QtWebEngine时第三方包,苹果并不直接支持进行App Store上签名和发布,所以构建和发布一个基于使用QtWebEngine的应用程序并不容易,这里我们对Qt 5.8稍微做一些修改,以便让我们的基于QtWeb引擎的应用程序并让签名能够得到苹果的许可。 QtWebEngine提供了C++和Qml的…...
微机原理与接口技术——中断系统与可编中断控制芯片8259A
目录 一、8259A 芯片介绍 二、8259A 的内部结构和引脚 三、8259A 的中断工作过程 四、8259A 的工作方式 五、8259A 的编程 六、外部中断服务程序 一、8259A 芯片介绍 Intel 8259A 是可编程中断控制器,可用于管理 Intel 8080/8085、8086/8088、80286/80386 的…...

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …...
面试题分享11月7日
1、ThreadLocal 是什么 是 Java 中线程的本地方法变量,用来存储每个线程的私有数据,每个线程都有它的独立副本,相互隔离,互不影响 2、ThreadLocal 实现原理 每个 ThreadLocal 都有一个 ThreadLocalMap 对象,用来存储…...

数据结构_哈夫曼树及其应用
构造算法的例子 构造算法的实现 初始化,置权值 int i, m, s1, s2;m 2 * n - 1;for (i 1; i < m; i){HT[i].lch 0;HT[i].rch 0;HT[i].parent 0;}for (i 1; i < n; i){cin >> HT[i].weight;}合并结点 // 创建哈夫曼树for (i n 1; i < m; i){s1…...
从0开始学习机器学习--Day19--学习曲线
一般来说,如果一个算法的表现不理想,那么多半是因为出现了欠拟合或过拟合问题,这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题,亦或是二者皆有,这有助于我们精准定位问题所在。 之前,我们发现…...
2.索引:深入解析 B+ 树:原理、MySQL 应用及与其他数据结构的对比
B 树是一种高效的平衡树结构,在数据库和文件系统中被广泛应用,尤其在 MySQL 中,InnoDB 存储引擎通过 B 树实现索引结构,提升了大数据量条件下的查询性能。 本文将深入介绍 B 树的原理和设计特点,分析 MySQL 中使用 B …...

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现
目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…...
如何在 Docker 容器中启动 X11 图形界面程序
如何在 Docker 容器中启动 X11 图形界面程序 在使用 Docker 时,我们通常会发现,容器中的图形应用没法直接显示到宿主机的界面上。不过,我们可以通过共享 X11 的 Unix 套接字,让容器把显示数据传递给宿主机的 X11 服务器ÿ…...

pycharm保存是自动格式化
在PyCharm中设置保存时自动格式化代码,可以按照以下步骤进行: 1. 打开设置 在Windows和Linux系统中,可以通过File(文件)->Settings(设置)打开设置窗口;在Mac系统中,…...
.netCore WebAPI中字符串加密与解密
In today’s digital landscape, securing sensitive information is more critical than ever. If you’re using ASP.NET Core, you might store configuration settings in appsettings.json. However, hardcoding sensitive data like connection strings or API keys in p…...

Next.js + Move 石头剪刀布
rock-paper-scissors 写在前面 本地 源码:https://github.com/zcy1024/SuiStudy/tree/main/rock-paper-scissors # 或其它等价的命令来安装依赖并将项目跑起来 pnpm install pnpm run dev # http://localhost:3000/在线(如果没过期的话) …...
[面试]关于Redis 的持久化你了解吗
Redis的持久化是指Redis服务器在关闭或重启时,将内存中的数据保存到磁盘上的一种机制。Redis支持多种持久化方式。 一、RDB(Redis Database)持久化 RDB持久化是Redis默认采用的持久化方式,它将Redis在某个时间点的数据保存到磁盘上…...
Systemd:tmpfiles
Systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。 $ systemctl list-units --all | grep systemd-tmpfilessystemd-tmpfiles-clean.service load…...
【Flutter 内嵌 android 原生 View以及相互跳转】
Flutter 内嵌 android 原生 View以及相互跳转 一. 内嵌android 原生View二、android 与 flutter 相互跳转 一. 内嵌android 原生View 在android 工程的包名下,也可在MainActivity创建 android 原生view ,继承PlatformView // 1.自定义textview public st…...
python externally-managed-environment 外部管理环境
https://realpython.com/python-virtual-environments-a-primer/?refyaolong.net#why-do-you-need-virtual-environments 简而言之, pip 默认会将您安装的所有外部包放置在 Python 安装路径/site-packages/ 的文件夹中一些Linux 和 macOS操作系统 预装了内部的 P…...

前端 | MYTED单篇TED词汇学习功能优化
文章目录 📚实现效果🐇before🐇after 📚模块实现解析🐇html🐇css🐇javascript 📚实现效果 🐇before 点击TED单篇词汇表按钮,选择对应TED打卡号,…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...