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.xdnf.cn/news/1558947.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

R语言运行地理探测器模型

地理探测器&#xff08;GeoDetector&#xff09;是一种用于空间分析的统计模型&#xff0c;它能够探测空间分异性以及揭示其背后驱动力的一组方法。它的核心思想是基于这样的假设&#xff1a;如果某个自变量对某个因变量有重要影响&#xff0c;那么自变量和因变量的空间分布应该…

java的LinkedList

java的LinkedList 什么是LinkedListLinkedList的模拟实现LinkedList的使用ArrayList和LinkedList的区别 什么是LinkedList LinkedList的官方文档 LinkedList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的结点中&#xf…

【Redis】Set类型的常用命令与应用场景

目录 1.命令小结 2.命令解析 3.编码方式与应用场景 1.命令小结 &#xff08;1&#xff09;set的特点 1&#xff09;set中存放的数据也都是String类型 2&#xff09;set集合中的元素是无须的 3&#xff09;set集合中的元素是唯一的&#xff0c;不可重复 &#xff08;2&a…

MySql 之 Binglog 复制

复制是一种将数据从一个 MySQL 数据库服务器异步复制到另一个的技术。使用 MySQL 复制选项&#xff0c;您可以复制所有数据库、选定的数据库甚至选定的表&#xff0c;具体取决于您的使用情况。 前提条件 确保在源服务器上启用了二进制日志记录。确保复制配置中的所有服务器都有…

uniapp——h5的控制台调试、h5调试

介绍 小程序在调试的时候可以打开调试模式&#xff0c;可以看到console.log的打印情况。 但是H5运行到手机上没有默认的调试的模式&#xff0c;但是可以人为手动加一个。 如何实现 1、main.js文件 import Vconsole from ‘vconsole’ /** 关闭正式环境打印日志&#xff…

Centos7.5 安装和配置jdk17

目录 一、下载JDK17包 二、将安装包放入服务器 三、解压jdk包到/usr/lib/jvm 四、修改JDK环境配置 1、打开配置文件 2、最后一行插入 3、立即生效 4、检查版本 一、下载JDK17包 访问网址:Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads…

音频功放工作原理:【B类】

上一节我们讲了A类音频功放的工作原理&#xff0c;也知道了它的优缺点&#xff1a; A类功放优点&#xff1a;高增益&#xff0c;低失真&#xff0c;音质好 A类功放缺点&#xff1a;热量高&#xff0c;效率低&#xff0c;功率小 为了解决A类功放的缺点&#xff0c;业界又引入…

重学SpringBoot3-集成Redis(十)之实时统计和分析

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;十&#xff09;之实时统计和分析 1. 实时统计和分析的常见场景2. 使用 Redis 数据结构进行实时统计3. 使用Redis String实现计数器…

原来机器学习那么简单——K近邻回归

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、什么是K近邻回归&#xff1f; K近邻回归&…

10.9QT对话框以及QT的事件机制处理

MouseMoveEvent(鼠标移动事件) widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 设置窗口为无边框&#xff0c;去掉标题栏等装饰this->setWi…

电脑缺失msvcr120.dll怎样修复,马上教你6种修复方法

在用电脑的时候&#xff0c;经常会碰到各种错误提示&#xff0c;比如“msvcr120.dll丢失”&#xff0c;导致的结果就是某些程序无法正常启动。那么&#xff0c;这个dll文件到底是啥&#xff0c;为什么会丢失&#xff0c;怎么解决呢&#xff1f;将通过这篇文章详细解释一下&…

智能优化算法-引力搜索优化算法(GSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 引力搜索优化算法 (Gravitational Search Algorithm, GSA) 是一种基于牛顿万有引力定律的元启发式优化算法&#xff0c;由Rashedi等人于2009年提出。GSA通过模拟天体之间的引力作用来搜索最优解&#xff0c;适用…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

P-Tuning v2:一种普遍有效的提示调整方法

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调&#xff08;fine-tuning&#xff09;来适应特定任务虽然效果显著&#xff0c;但存在训练成本高、参数存储量大等问题。为了解决这些问题&#xff0c;清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…

colab+ngork本地访问多模态大模型

allenai/Molmo-7B-D-0924 1&#xff09;colab准备环境&#xff0c;我这里用的是l4 2&#xff09;安装对应的python库 !pip install transformers Pillow requests einops!pip install accelerate>0.26.0 bitsandbytes!pip install --no-deps accelerate bitsandbytes !p…

怎么将手机备忘录传送至电脑

在数字化时代&#xff0c;手机备忘录已成为我们生活中不可或缺的一部分。无论是记录购物清单、工作事项&#xff0c;还是灵感闪现的瞬间&#xff0c;手机备忘录都能随时记录下这些宝贵的信息&#xff0c;帮助我们防止遗忘。然而&#xff0c;有时候我们需要将这些备忘录内容转移…

数字影像技术平台推动可持续发展创意产业

在这个日新月异的数字时代&#xff0c;数字影像技术平台正以前所未有的力量&#xff0c;为可持续发展创意产业注入勃勃生机与无限可能。它们不仅是技术革新的前沿阵地&#xff0c;更是推动社会进步、促进文化繁荣的绿色引擎。 从高清细腻的VR体验&#xff0c;到震撼人心的AR互…

Tailwind Css的使用

1.Tailwind Css是什么 官网解释&#xff1a;Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类&#xff08;class&#xff09;名&#xff0c;然后生成相应的样式代码并写入 到一个静态 CSS 文件中。 我的理解是利用Tailwind CSS 提供的…

共享单车轨迹数据分析:以厦门市共享单车数据为例(十)

副标题&#xff1a;共享单车与地铁站出入口分布情况探究——以厦门市为例 假期结束了&#xff0c;我们满血复活&#xff0c;继续更新&#xff01; 本篇文章我们讨论共享单车与地铁出入口的关系&#xff0c;在上一篇文章中&#xff0c;我们讨论了综合得分指数最高的地铁站——…

利用可解释性技术增强制造质量预测模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习&#xff08;ML&#xff09;模型性能的方法。该方法已用于铣削质量预测&#xff0c;这一过程首先训练 ML 模型&#xff0c;然后使用可解释性技术识别不需要的特征并去…