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()); 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->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(.0f); cameraEntity->setPosition(QVector3D(.0f)); cameraEntity->setUpVector(QVector3D()); cameraEntity->setViewCenter(QVector3D()); // 7、在“画布”中加入子实体“光照light” Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity); // 定义一种光源对象,这里定义的是“点光”,此外还有“定向光”以及“聚集光”可选 Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity); light->setColor("white"); light->setIntensity(); 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(); sphereMesh->setSlices(); sphereMesh->setRadius(); // 仅仅有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(.3f); sphereTransform->setTranslation(QVector3D(.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(); return app.exec(); |
附截图一张

QT3D场景快速绘制入门学习的更多相关文章
- 矩阵快速幂(入门) 学习笔记hdu1005, hdu1575, hdu1757
矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html.二进制这个东西太神奇了,好多优秀的算 ...
- Sass简单、快速上手_Sass快速入门学习笔记总结
Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Qt快速入门学习笔记(画图篇)
1.Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执行 ...
- 新手学习Java,如何快速从入门到精通!
首先我要给你说的是,任何一个东西从零到精通,都是需要一个过程的,就相当于我们在小学的时候学乘法口诀表,背文言文一样,都是需要我们慢慢的去渡过这个阶段,我们才能慢慢的掌握,其次,毕竟这是一门编程语言,你 ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- OpenGL入门学习(转)
OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...
- OpenGL入门学习(转载)
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...
- SCARA——OpenGL入门学习五六(三维变换、动画)
OpenGL入门学习(五) 此课为三维变换的内容,比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果, 在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能 ...
随机推荐
- php的变量引用与销毁机制
在php中,符号"&"表示引用. 1.看看不引用的情况是这样子: $a = "hello world";//定义一个变量,下面赋值给$b $b = $ ...
- Eclipse调试Java的10个技巧【转】
clipse调试Java的10个技巧 先提三点 不要使用System.out.println作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志 1.条件断点 想象一下我们平时 ...
- Redis源码研究—基础知识
1. Redis 是什么 Redis是一个开源的使用ANSI C语言编写的基于内存的key/value存储系统,与memcache类似,但它支持的value类型更多,包括:字符串(string).链表 ...
- 基于octree的空间划分及搜索操作
(1) octree是一种用于管理稀疏3D数据的树形数据结构,每个内部节点都正好有八个子节点,介绍如何用octree在点云数据中进行空间划分及近邻搜索,实现“体素内近邻搜索(Neighbors wi ...
- Struts2技术详解
1, 当Action设置了某个属性后,Struts将这些属性封装一个叫做Struts.valueStack的属性里.获取valueStack对象: ValueStack vs = (ValueStac ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- 我最喜欢的jQuery插件模板
我使用jQuery已经有相当长的时间了,并且我会常常为它写一些插件(plugin).我尝试过用不同的方式去写,现在这个模板是我最喜欢的: 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- 很简单的在Ubuntu系统下安装字体和切换默认字体的方法
摘要: Ubuntu系统安装好后,默认字体对于中文的支持看上去不太美丽,于是很多朋友可能需要设置系统的默认字体为自己喜欢的字体.本文主要介绍如何解决这两个问题. 说明:测试系统是Ubuntu14.04 ...
- MYSQL查询前30条数据
, LIMIT 接受一个或两个数字参数. 参数必须是一个整数常量. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 (而不是 )
- Spring面试,IoC和AOP的理解
spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...