「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打卡号,…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
