qt 3D编程

Qt 3D是一个用于构建交互式3D图形应用的库,它是Qt库的一
部分。Qt 3D提供了一组C++和QMLAPI,帮助开发者快速构
建3D应用程序。

一、核心模块

  1. Qt3DCore

    • 功能:提供3D场景中的基本概念,如实体(Entity)、组件(Component)、节点(Node)等。这些基本类构成了Qt 3D中的场景树(Scene Tree),用于描述3D世界中的对象及其属性。
    • 关键类:QEntity(表示3D场景中的一个实体,可以包含多个组件)、QComponent(实体的组成部分,如变换、几何形状、材质等)、QNode(场景树中的基本元素,代表一个对象或属性)、QTransform(用于定义实体的位置、旋转和缩放)等。
  2. Qt3DRender

    • 功能:负责处理渲染管道、材质、光源等渲染相关的功能。
    • 关键类:QCamera(定义观察3D场景的摄像机)、QMesh(表示3D模型,包含顶点、法线、纹理坐标等信息)、QMaterial(定义3D对象的材质属性,如颜色、纹理等)、QTechnique(定义渲染技术,如OpenGL版本、着色器等)、QRenderSettings(设置渲染参数,如渲染策略、帧率等)、QLight(表示光源,用于照亮场景中的物体,如点光源、平行光和聚光灯)、QRenderAspect(管理渲染过程,包括管线设置、资源加载和帧更新)、QFrameGraphNode(定义渲染过程中的各个阶段,构成渲染帧图)、QRenderPass(表示渲染过程中的一个阶段,如几何处理或光照计算)、QShaderProgram(管理顶点着色器、片段着色器和几何着色器等)、QShaderProgramBuilder(用于构建着色器程序)、QParameter(用于向着色器传递参数,如材质属性、光源信息和变换矩阵等)等。
  3. Qt3DInput

    • 功能:用于处理用户输入,如键盘、鼠标和触摸屏输入。
    • 关键类:QInputAspect(管理输入事件的处理,如键盘、鼠标和触摸屏等)、QInputSettings(配置输入设备)、QMouseDevice(表示鼠标设备)、QKeyboardDevice(表示键盘设备)、QMouseHandler(处理鼠标事件)、QKeyboardHandler(处理键盘事件)等。
  4. Qt3DAnimation

    • 功能:提供关键帧、骨骼动画和变形动画等功能。
    • 关键类:QAnimationAspect(负责管理和驱动场景中的动画效果)、QAbstractAnimationClip(表示一个动画片段,包含一组关键帧)、QAbstractClipAnimator(用于将动画片段应用到实体上)、QChannelMapper(将动画片段的通道映射到实体的属性上)等。
  5. Qt3DLogic

    • 功能:用于处理游戏逻辑和事件系统。
    • 关键类:QLogicAspect(处理逻辑更新,如物理模拟、动画等)等。
  6. Qt3DExtras

    • 功能:提供了一些实用的预制组件和功能,如简单几何体、摄像机控制器等。
    • 关键类:QConeMesh(创建圆锥几何形状)、QCylinderMesh(创建圆柱几何形状)、QSphereMesh(创建球体几何形状)、QPhongMaterial(使用Phong光照模型的材质,提供了漫反射、镜面反射和环境光效果)、QGoochMaterial(使用Gooch光照模型的材质,适用于非真实感渲染(NPR))、QNormalDiffuseMapMaterial(使用法线贴图和漫反射贴图的材质,可以实现更真实的表面细节效果)等。

二、相机的设置与控制

在Qt 3D中,相机的设置和控制是通过Qt3DRender::QCamera类实现的。QCamera类提供了多种属性和方法,可以方便地设置相机的视角、位置和朝向等参数。以下是一些常用的方法:

  1. setProjectionType():设置投影类型,如透视投影(PerspectiveProjection)和正交投影(OrthographicProjection)。
  2. setFieldOfView():设置视场角(仅对透视投影有效)。
  3. setAspectRatio():设置宽高比。
  4. setNearPlane()和setFarPlane():设置相机的近裁剪平面和远裁剪平面。
  5. setPosition()和setViewCenter():设置相机的位置和观察中心点。
  6. setUpVector():设置相机的上向量,用于确定相机的朝向。

三、构建基本的三维场景

以下是使用Qt 3D构建一个基本三维场景的步骤:

  1. 创建场景根节点:通常使用QEntity作为根节点,它将包含场景中的所有实体。
  2. 添加实体:为场景添加几何形状、光源、摄像机等实体。这些实体通常包含多个组件,如QMesh、QMaterial、QLight等。
  3. 设置变换:为实体添加QTransform组件,设置它们在场景中的位置、旋转和缩放等属性。
  4. 配置摄像机:设置摄像机的位置、朝向和投影矩阵,以控制渲染的视角和视野。
  5. 处理输入事件:使用Qt3DInput模块中的类来捕捉和处理用户输入,如键盘、鼠标和触摸屏等。
#include <QVBoxLayout>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DRender/QCamera>
#include <Qt3DCore/QEntity>
#include <Qt3DRender/QMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DCore/QTransform>
#include <Qt3DInput/QInputAspect>
#include <QForwardRenderer>
#include <QScreen>
#include <Qt3DRender/QCameraLens>
#include <QOrbitCameraController>
#include <Qt3DAnimation>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget *mainWindow = new QWidget;QVBoxLayout *layout = new QVBoxLayout(mainWindow);Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));QWidget *container = QWidget::createWindowContainer(view);QSize screenSize = view->screen()->size();container->setMinimumSize(QSize(708,574));container->setMaximumSize(screenSize);layout->addWidget(container);mainWindow->show();Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;Qt3DRender::QCamera *camera = view->camera();camera->lens()->setPerspectiveProjection(40.0f, 708.0f / 574.0f, 0.1f, 1000.0f);camera->setPosition(QVector3D(0,13.5,16.65f));camera->setViewCenter(QVector3D(0,0, -3.35));camera->setUpVector(QVector3D(0.0, 1.0, 0.0));camera->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection);Qt3DCore::QEntity *cubeEntity = new Qt3DCore::QEntity(rootEntity);Qt3DRender::QMesh *cubeMesh = new Qt3DRender::QMesh;cubeMesh->setSource(QUrl::fromLocalFile((":/res/zhiche.obj")));Qt3DExtras::QPhongMaterial *cubeMaterial = new Qt3DExtras::QPhongMaterial;cubeMaterial->setDiffuse(QColor(QRgb(0xffffff)));//0xbeb32bQt3DCore::QTransform *cubeTransform = new Qt3DCore::QTransform;cubeTransform->setScale(0.1f);//cubeTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0,1,0), 45.0f));cubeTransform->setTranslation(QVector3D(0.0f, -80.0f, -100.0f));// 定时器每帧更新旋转QTimer *timer = new QTimer();QObject::connect(timer, &QTimer::timeout, [=]() {static float angle = 0.0f;angle += 1.0f; // 每次增加 1 度if (angle >= 360.0f) {angle = 0.0f; // 重置到 0}cubeTransform->setRotation(QQuaternion::fromEulerAngles(0, angle, 0)); // 绕 Y 轴旋转});timer->start(16); // 每 16ms 更新一次(约60fps)cubeEntity->addComponent(cubeMesh);cubeEntity->addComponent(cubeMaterial);cubeEntity->addComponent(cubeTransform);view->setRootEntity(rootEntity);// InputhandlingQt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;view->registerAspect(input);Qt3DExtras::QOrbitCameraController *cameraController = new Qt3DExtras::QOrbitCameraController(rootEntity);cameraController->setCamera(camera);cameraController->setLinearSpeed(50.0f);cameraController->setLookSpeed(180.0f);mainWindow->setLayout(layout);mainWindow->show();return a.exec();
}

DEMO下载:点击跳转

qq群交流:698593923

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

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443310.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 表空间异构传输

已经有了表空间的数据文件&#xff0c;和元数据dump文件&#xff0c;如何把这个表空间传输到异构表空间中&#xff1f; 查询异构传输平台信息&#xff1a; COLUMN PLATFORM_NAME FORMAT A40 SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM O…

数据分析Power BI设置万为单位的数据

玩过Power BI的同学都知道&#xff0c;power BI在度量值设置单位里&#xff0c;唯独没有万这个单位&#xff0c;但是我们可以自定义&#xff0c;操作过程如下&#xff1a; 1.用DAX新建单位表 单位 SELECTCOLUMNS( { ( "元", 1), ("万",10000), ("千…

初识Mysql/备份,基础指令

1&#xff0c;MySQL登录指令&#xff1a; mysql -h 127.0.0.1 -P3306 -u -p 其中&#xff0c;-h指明登录部署了mysql服务的主机 -P指明要访问的端口号&#xff0c; -u指明登录用户 -p输入密码 2&#xff0c;数据库基础 mysql&#xff1a;表示的是客户端 mysqld&…

posix接口与system V接口及其异同

POSIX接口和System V接口是用于多线程和进程间通信的两种主要编程接口。它们各自有不同的特点、功能和适用场景。以下是对这两种接口的详细介绍及其异同点。 POSIX接口 特点 标准化: POSIX&#xff08;可移植操作系统接口&#xff09;是由IEEE制定的标准&#xff0c;旨在提供统…

大数据新视界 --大数据大厂之 GraphQL 在大数据查询中的创新应用:优化数据获取效率

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【Linux】man手册安装使用

目录 man(manual,手册) 手册安装: 章节区分&#xff1a; 指令参数: 使用场景&#xff1a; 手册内容列表: 手册查看快捷键: 实例: 仍致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 在开头先提醒一下:在 man 手册中退出的方法很简单…

给Windows系统设置代理的操作方法

一、什么是代理 网络代理是一种特殊的网络服务&#xff0c;允许一个网络终端通过这个服务与另一个网络终端进行非直接的连接&#xff0c;而提供代理服务的电脑系统或其它类型的网络终端被称为代理服务器。 代理服务器是网络信息的中转站&#xff0c;代理服务器就像是一个很大的…

map和set(c++)

前言 在前面我们在介绍二叉搜索树时我们分别实现了一个key结构和key-val结构&#xff0c;如果我们再进一步完善这棵树&#xff0c;将二叉搜索树升级为红黑树去存储key和key-val那么我们就可以得到我们今天要介绍的主角map和set。当然了标准库的实现还是有很多需要注意的地方&a…

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式&#xff1a; 一、在应用的设置中添加选项 …

C语言练习

题目: 1.如果在int型变量的声明中为变量赋一个实数值(如3.12或4.6)的初始值会怎样呢&#xff1f;请打一段代码来看看 分析&#xff1a;……不用分析&#xff0c;开个玩笑&#xff0c;虽然很简单但是还是按照惯例水上一波数字 1.首先按照题目要求用函数类型int整型给变量赋值…

鸿蒙网络管理模块05——数据流量统计

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 HarmonyOS供了基于物理网络的数据流量统计能力&#xff0c;支持基于网卡/U…

【PS2020】Adobe Photoshop 2020 中文免费版

photoshop 2020是全球最大的图像处理软件&#xff0c;为用户提供了广泛的专业级润饰工具套件&#xff0c;集成了专为激发灵感而设计的强大编辑功能&#xff0c;帮助用户制作出满意的图片效果&#xff0c;是很多摄影师、广告师等专业人员必备的一款图像及照片后期处理大型专业软…

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile

1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载&#xff0c;所以网上找了资源&#xff0c;下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于&#xff1a;Py…

Java-进阶二

单列集合&#xff1a; ----------List ArrayList的源代码分析&#xff08;扩容原理&#xff09; 1 使用空参构造的集合&#xff0c;在底层创建一个容量为0的数组。2 添加第一个元素时&#xff0c;底层会扩容创建一个容量为10的数组。3 存满时会扩容1.5倍。4 如果一次添加多个…

大模型基础:基本概念、Prompt、RAG、Agent及多模态

随着大模型的迅猛发展&#xff0c;LLM 作为人工智能的核心力量&#xff0c;正以前所未有的方式重塑着我们的生活、学习和工作。无论是智能语音助手、自动驾驶汽车&#xff0c;还是智能决策系统&#xff0c;大模型都是幕后英雄&#xff0c;让这些看似不可思议的事情变为可能。本…

Redis SpringBoot项目学习

Redis 是一个高性能的key-value内存数据库。它支持常用的5种数据结构&#xff1a;String字符串、Hash哈希表、List列表、Set集合、Zset有序集合 等数据类型。 Redis它解决了2个问题&#xff1a; 第一个是&#xff1a;性能 通常数据库的读操作&#xff0c;一般都要几十毫秒&…

虚拟机没有网络怎么解决

CentOS7为例 进入虚拟网络编辑器 1.更改设置 2.选中NAT模式点击3点击移除网络 4添加网络&#xff0c;随便选一个 5.点开NAT设置&#xff0c;记住网关 6.DHCP设置&#xff0c;注意虚拟机设置ip必须在起始ip和结束ip范围内 进入虚拟机网络适配器&#xff0c;自定义选中第4步操作…

【Kubernetes】常见面试题汇总(五十二)

目录 116. K8S 集群服务暴露失败&#xff1f; 117.外网无法访问 K8S 集群提供的服务&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-…

torchvision.transforms.Resize()的用法

今天我在使用torchvision.transforms.Resize()的时候发现&#xff0c;一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面&#xff0c;torchvision.transforms.Resize((size,size))&#xff0c;大家都很清楚&#xff0c;会将图像的h和w大小都变成size。 但是…

大学生课程设计报告--基于JavaGUI的贪吃蛇

前言 ​ 贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的; ​ 不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而…