在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++类:

 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());
    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场景快速绘制入门学习的更多相关文章

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

    矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html.二进制这个东西太神奇了,好多优秀的算 ...

  2. Sass简单、快速上手_Sass快速入门学习笔记总结

    Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...

  3. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  4. Qt快速入门学习笔记(画图篇)

    1.Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执行 ...

  5. 新手学习Java,如何快速从入门到精通!

    首先我要给你说的是,任何一个东西从零到精通,都是需要一个过程的,就相当于我们在小学的时候学乘法口诀表,背文言文一样,都是需要我们慢慢的去渡过这个阶段,我们才能慢慢的掌握,其次,毕竟这是一门编程语言,你 ...

  6. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  7. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

  8. OpenGL入门学习(转载)

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

  9. SCARA——OpenGL入门学习五六(三维变换、动画)

    OpenGL入门学习(五) 此课为三维变换的内容,比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果, 在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能 ...

随机推荐

  1. 【Android】Android6.0读取通话记录

    需求:读取通话记录,然后列表显示,每条记录的数据包括姓名.号码.类型(来电.去电.未接,字体颜色分别为绿.蓝.红),然后长按条目弹出一个列表弹窗,显示[复制号码到拨号盘].[发短信].[打电话]. 先 ...

  2. 百度地图Api进阶教程-点聚合9.html

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. git设置HTTP代理

    git设置HTTP代理 设置HTTP代理 如果公司使用代理,git就需要设置代理才能克隆远程仓库 执行下面两条语句 git config --global http.proxy 10.167.32.1 ...

  4. 修改ie11的默认搜索引擎和主页

    虚机自动升级到了ie11,但发现默认的主页.搜索引擎都无法修改,改完了重新打开ie又被重置成微软的东东.找了个帖子,发现只要修改c:\windows\system32\drivers\etc下的hos ...

  5. 即时通信(IM)和实时通信(RTC)的区别

    即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...

  6. CentOS 7系统LAMP配置PHP-FPM的示例

    CentOS 7 系统出来有一段时间了,今天我们来看在vps中的 CentOS 7 中给lamp环境配置php-fpm的过程,希望文章可以帮助到各位. CentOS 7 已经发布,并且采用 Apach ...

  7. APICloud 实践 —— 安装与创建应用

    1.安装APICloud Studio 下载地址:https://www.apicloud.com/devtools 2.打开 APICloud Studio,登录 3.登录成功,在 代码编辑器 创建 ...

  8. 使用python(command line)出现的ImportError: No module named 'xxx'问题

    当你在python.exe直接输入 import test 时报出importerror: no module named 'test' ,这个错误时由于路径问题,sys并没有找到你输入的这个文件 解 ...

  9. ASP.NET中使用jQuery插件实现图片幻灯效果

    参照网上的资料及提供的jQuery插件实现图片幻灯效果. 1.页面前台代码: //头部引用 <head runat="server"><title>< ...

  10. Qt中QString::toStdString().c_str() 偶尔存在问题

    假设 QString str = "string"; const char* c = str.toStdString().c_str()单步调试显示的结果可能会是'\0' 而当我这 ...