QT3D场景快速绘制入门学习
在QT中实现3D绘制的方式:
1) 使用QT OpenGL模块(QOpenGLWidget等)
2) 使用QT 3D C++类(QEntity等)
3) 使用QT 3D QML类(Entity等)
QT3D场景提供了一种快速设置3D场景的一种方式,用户凭借着封装好的实体可以快速的在顶层实体(画布)当中增加各种各样的实体,并且通过3DMax软件构造的OBJ文件与QT3D实现信息交互可以的帮助用户摆脱OpenGL的用代码绘制图形的繁琐。
下面以QT Demo “Basic Shapes C++ Example”为例来讲解下创建3D场景的一般步骤和用到的具体C++类:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
int main(int argc, char **argv)
{ QApplication app(argc, argv); // 1、创建3D场景视图窗口view Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow(); view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f))); // 2、创建放置3D场景视图窗口的容器,场景view需要先放在一个容器中 QWidget *container = QWidget::createWindowContainer(view); QSize screenSize = view->screen()->size(); container->setMinimumSize(QSize(200, 100)); container->setMaximumSize(screenSize); // 3、创建一个主窗口Widget,进行适当布局操作 QWidget *widget = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(widget); QVBoxLayout *vLayout = new QVBoxLayout(); vLayout->setAlignment(Qt::AlignTop); // 4、将3D场景容器加入布局当中 hLayout->addWidget(container, 1); hLayout->addLayout(vLayout); // 给应用程序主窗口设置一个标题 widget->setWindowTitle(QStringLiteral("Basic shapes")); // 5、创建根实体(Root Entity)对象,即所谓的“画布”,并将其设置到3D场景视图中去 Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); view->setRootEntity(rootEntity); // 6、在显示3D图形的过程当中,摄像机是必不可少的,只有摄像机摆放的合适人眼才能看到3D建模的样子 Qt3DRender::QCamera *cameraEntity = view->camera(); cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f / 9.0f, 0.1f, 1000.0f); cameraEntity->setPosition(QVector3D(0, 0, 20.0f)); cameraEntity->setUpVector(QVector3D(0, 1, 0)); cameraEntity->setViewCenter(QVector3D(0, 0, 0)); // 7、在“画布”中加入子实体“光照light” Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity); // 定义一种光源对象,这里定义的是“点光”,此外还有“定向光”以及“聚集光”可选 Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity); light->setColor("white"); light->setIntensity(1); lightEntity->addComponent(light); // 定义光照实体的变换(设置光照显示位置等) Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity); lightTransform->setTranslation(cameraEntity->position()); lightEntity->addComponent(lightTransform); // 8、摄像机控制配置(这里配置以第一人称视角控制场景摄影机) Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity); camController->setCamera(cameraEntity); // 9、现在就可以绘制各种3D场景的实体图形了 // 在这里有如下的几种方法可以选择, // 首先就是用OpenGL画出实体(适合OpenGL的老手,不适于新手), // 然后就是用Qt自带的基本实体(容易构造,简单易学), // 最后就是用例如3DMax导出的OBJ文件实现与QT之间的信息交互(容易上手,成为越来越多人的首选)。 // 本例采用的就是Qt基本实体去创建(以球体为例) // 在Qt中任何实体加入到三维模型中最为简单的配置方法分为以下几步: // 首先再根实体中创建实体[设置实体名称可选], Qt3DCore::QEntity *sphereEntity = new Qt3DCore::QEntity(rootEntity); m_ sphereEntity ->setObjectName("Sphere"); // 然后配置渲染(轮廓形状Mesh、材质Materials、变换Transform)方面与实体相关的元素, // Mesh(实体轮廓形状,由一个个网格组成,网格越多显示效果越好) Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh(); sphereMesh->setRings(20); sphereMesh->setSlices(20); sphereMesh->setRadius(2); // 仅仅有Mesh,一个实体只会显示一片黑,Material提供了实体表面的呈现
// Material(表面贴图等材质显示,有多种不同类型的材质可选)
Qt3DExtras::QPhongMaterial *sphereMaterial = new Qt3DExtras::QPhongMaterial(); sphereMaterial->setDiffuse(QColor(QRgb(0xff0000))); // Transform(缩放大小、旋转以及在三维模型中的位置等) // 实现实体旋转功能说明: // void setRotation(const QQuaternion &rotation) 绕点旋转 // void setRotationX(float rotationX) 绕X轴旋转 // void setRotationY(float rotationY) 绕Y轴旋转 // void setRotationZ(float rotationZ) 绕Z轴旋转 Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform(); sphereTransform->setScale(1.3f); sphereTransform->setTranslation(QVector3D(0.0f, .0.f, 0.0f)); // 可选:给实体加入鼠标拾取功能 Qt3DRender::QObjectPicker *picker = new Qt3DRender::QObjectPicker(sphereEntity); picker->setHoverEnabled(true); picker->setEnabled(true); connect(picker, &Qt3DRender::QObjectPicker::clicked, this, &SceneModifier::mouseClicked); connect(picker, &Qt3DRender::QObjectPicker::pressed, this, &SceneModifier::mousePressed); connect(picker, &Qt3DRender::QObjectPicker::released, this, &SceneModifier::mouseReleased); connect(picker, &Qt3DRender::QObjectPicker::entered, this, &SceneModifier::mouseEntered); connect(picker, &Qt3DRender::QObjectPicker::exited, this, &SceneModifier::mouseExited); // 最后将各渲染组件加入到实体list中去。 sphereEntity->addComponent(sphereMesh); sphereEntity->addComponent(sphereMaterial); sphereEntity->addComponent(sphereTransform); sphereEntity->addComponent(picker); // 10、设置实体可显示 sphereEntity ->setEnabled(true); // 显示主窗口 widget->show(); widget->resize(1200, 800); return app.exec(); |
附截图一张
QT3D场景快速绘制入门学习相关推荐
- Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)
全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...
- 刘海洋 · LaTeX 不快速的入门 学习笔记
刘海洋 · LaTeX 不快速的入门 学习笔记 网址链接 : 刘海洋 · LaTeX 不快速的入门 - 跟着大神学习最纯正的 LaTeX 知识 一.组织文档结构 1. 文档基本结构 以document ...
- Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)
全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...
- Python快速编程入门#学习笔记02# |第十章 :Python计算生态与常用库(附.小猴子接香蕉、双人乒乓球小游戏源码)
全文目录 学习目标 1. Python计算生态概述 1.1 Python计算生态概述 2. Python生态库的构建与发布 2.1 模块的构建与使用 * 2.1.1第三方库/模块导入的格式 2.2 包 ...
- 用Python爬取了拉勾网的招聘信息+详细教程+趣味学习+快速爬虫入门+学习交流+大神+爬虫入门...
关于 一直埋头学习,不知当前趋势,这是学习一门技术过程中最大的忌讳.刚好利用python爬虫,抓取一下拉勾网关于python职位的一些基本要求,不仅能知道岗位的基本技能要求,还能锻炼一下代码能力,学以 ...
- Python快速编程入门#学习笔记08# |第8章 :面向对象
目录 1. 面向对象概述 2. 类的定义 3.对象的创建与使用 类的成员 4.属性 1.类属性 2.实例属性 5.方法 1.实例方法 2.类方法 3.静态方法 6.私有成员 特殊方法 7.构造方法 8 ...
- Python快速编程入门#学习笔记06# |第6章 :函数(学生管理系统)
目录 1.1 函数概述 1.2 定义函数和调用 函数的定义 函数的调用 1.3 参数的传递 位置参数的传递 关键字参数的传递 默认(缺省)参数的传递 参数的打包与解包 混合传递 1.4 函数的返回值 ...
- 场景建模都用到哪些三维软件,入门学习选择3DsMax还是Maya
Maya软件: 是美国Autodesk公司出品的世界顶级的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等.Maya功能完善,工作灵活,易学易用,制作效率极高,渲染真实感极强,是电影级别的 ...
- Qt 快速入门学习笔记
Qt 快速入门学习笔记 环境安装 环境配置以及安装 安装包下载地址 1.windows安装 msvc编译器模块需要安装Windows软件开发工具包. MinGW是Windows平台使用GNU工具导入库 ...
- AI快速入门学习的经验积累-最佳学习路线图谱梳理
一 最难的一件事 要成为大牛,其实不难,只需要做一件事 -- 学习:然而其实也很难,因为必须做到一件事 -- 坚持学习.无关智商,无关信仰,能否坚持到底,至关重要. ...
最新文章
- python twisted安装
- python3 循环写入一对多键值对_为什么Python 3.6以后字典有序并且效率更高?
- 动态给a标签赋值_怎样利用Excel制作抖音上的心形动态函数图像?
- 单片机c语言pwm整流的程序,基于 单片机控制PWM整流电源的设计.doc
- java 反射 hold_Go进阶:反射3定律
- 法布里斯·贝拉:一个人就是一支队伍
- .NET环境下几种不同的邮件发送解决方案
- 英特尔中国研究院院长宋继强:摩尔定律的经济效益仍在继续
- 凸优化第四章凸优化问题 4.1 优化问题
- DenseNet解析
- linux下解压bin文件怎么打开方式,安卓手机如何打开.bin文件?
- 如何下载Java的API开发文档
- 手把手教你接入快应用Push
- 求助文章#C语言 #普中51单片机开发板
- Matlab中linspace函数和logspace函数详解
- 信息系统与信息化、信息系统开发方法、常规信息系统集成技术
- LRC (Lyric) 字幕
- 表格页面html代码怎么写,设置表格标题的html的代码怎么写
- MySQL万字总结(含测试代码)
- 运行深度学习出现Fail to create pixmap with Tk_GetPixmap in TkImgPhotoInstanceSetSize