QT3D场景快速绘制入门学习

在QT中实现3D绘制的方式:

1)   使用QT OpenGL模块(QOpenGLWidget等)

2)   使用QT 3D C++类(QEntiry等)

3)   使用QT 3D QML类(Entity等)

QT3D场景提供了一种快速设置3D场景的一种方式,用户凭借着封装好的实体可以快速的在顶层实体(画布)当中增加各种各样的实体,并且通过3DMax软件构造的OBJ文件与QT3D实现信息交互可以的帮助用户摆脱OpenGL的用代码绘制图形的繁琐。

下面以QT Demo “Basic Shapes C++ Example”为例来讲解下创建3D场景的一般步骤和用到的具体C++类:

C++ Code


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);

// 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();

}

附截图一张

原文地址:https://www.cnblogs.com/MakeView660/p/10319228.html

时间: 2024-11-02 23:26:09

QT3D场景快速绘制入门学习的相关文章

矩阵快速幂(入门) 学习笔记hdu1005, hdu1575, hdu1757

矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html.二进制这个东西太神奇了,好多优秀的算法都跟他有关系,这里所说的矩阵快速幂就是把原来普通快速幂的数换成了矩阵而已,只不过重载了一下运算符*就可以了,也就是矩阵的乘法,  当然也可以写成函数,标题中的这三个题都是关于矩阵快速幂的基础题.拿来练习练习熟悉矩阵快速幂,然后再做比较难点的,其实矩阵快速幂比较难的是构造矩阵.下面还是那题目直接说话

Objective C 快速入门学习五

<一>继承和多态 @class Complex 声明类(同C++) 子类函数成员 super 访问父类 同C++类似 1.通过继承 在子类中添加新方法 2.通过继承 在子类中添加新成员 3.通过继承 实现多态(实现比较简单,通过Id通用类型作为父类) 4.重载 5.抽象类abstract作用:创建子类更容易:提供了处理所有派生子类的公共接口:抽象方法制定了标准协议,规范子类必须实现. 6.通用类型id,编译时不会做类型检查,在运行时才会动态绑定具体类型,指出错误. 静态类型在编译阶段就会指出错

Objective C 快速入门学习二

Objective-C 类.对象.方法 1.编写一个复数类: #import <Foundation/Foundation.h>@interface Complex: NSObject //类声明,Complex继承NSObject { int iReal;//成员变量声明,在括号内 int iImag; } //成员函数声明,在括号外 -(void) print; -(void) setReal : (int) n; -(void)setImag : (int) d; @end //@int

Objective C 快速入门学习三

1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具体用法相同. 顺序.循环.选择 3.基本上Objective-C兼容了C语言所有特点,包括数组.结构.字符串.联合,它们不是对象,面向过程式.建议直接使用相关框架下的相关类,面对对象编程. Objective C 快速入门学习三

jquery 快速入门学习总结

jquery 快速入门学习总结 jquery简介 jquery 是一个免费,开源的javascript 库. jquery作用 方便完成web前端的工作,例如节点操作,元素操作,事件绑定,ajax操作,并且解决了大部分的兼容问题 jquery使用配置 1.本地配置 1.1 下载jquery文件,  www.jquery.com 1.2 引入,放在文件同目录       <script type="text/javascript" src="jquery.1.8.3.mi

Objective C 快速入门学习四

类 1.合成存取器方法 @property   成员变量 @synthesize 成员变量 可以让编译器自动合成 设置和获取函数的方法,不用手动生成set成员变量,Get成员变量 @interface Complex : NSObject { int iReal,iImag; } @property  int iReal, iImag;  //合成存取器方法,第一部:@property标识属性 -(void)print; @end @implementation Complex @synthes

Objective C 快速入门学习一

Objective-C程序设计 1. 直接用Xcode作为IDE,舍弃gcc编译方面的学习.2. 入门例子:Eg:打印Hello World 控制台程序 #import<Foundation/Foundation.h> //导入Foundation.h头文件.//头文件后缀.h,源文件后缀.m,Objective-C++后缀.mm. int main(int argc, const char* argv[])//主函数(和C/C++相同, // 和/* 内容 */表示注释符号){      N

零基础入门学习java,应该如何快速打好Java基础?

零基础入门学习java,应该如何快速打好Java基础?从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用. 创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学java能够持之以恒java爱好群,如果你想要学好java最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:快乐学习java组织

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的