Qt3D教程(二)初步显示3D的内容

前一篇很easy,全然就没有牵涉到3D的内容,它仅仅是我们搭建3D应用的基本框架而已,而这一篇。我们将要利用它来初步地显示3D的内容了!

本次目的是将程序中间的内容替换成3D的视图,而这一切也只是十几行代码。要不我们来试一试吧!

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131099。欢迎同行前来探讨。

首先我们须要对我们的MainWindow.cpp文件进行改动,在此基础上加入一些内容:

  1. #include <QQmlAspectEngine>
  2. #include <QRenderAspect>
  3. #include <QInputAspect>
  4. #include <QQmlContext>
  5. #include <QWindow>
  6.  
  7. #include "MainWindow.h"
  8. #include "ui_MainWindow.h"
  9.  
  10. class View3D: public QWindow
  11. {
  12. public:
  13. View3D( QScreen* targetScreen = Q_NULLPTR ): QWindow( targetScreen )
  14. {
  15. setSurfaceType( QSurface::OpenGLSurface );
  16.  
  17. QSurfaceFormat format;
  18. format.setSamples( 4 );
  19. setFormat( format );
  20.  
  21. create( );
  22. }
  23. };
  24.  
  25. Settings::Settings( QObject* parent ): QObject( parent )
  26. {
  27. m_showModel = true;
  28. }
  29.  
  30. void Settings::setShowModel( bool showModel )
  31. {
  32. if ( m_showModel == showModel ) return;
  33. m_showModel = showModel;
  34. emit showModelChanged( );
  35. }
  36.  
  37. MainWindow::MainWindow(QWidget *parent) :
  38. QMainWindow(parent),
  39. ui(new Ui::MainWindow)
  40. {
  41. ui->setupUi(this);
  42.  
  43. using namespace Qt3D;
  44. using namespace Qt3D::Quick;
  45. // 创建一个3D的视图
  46. // 1
  47. View3D* view3D = new View3D;
  48.  
  49. // 2
  50. QQmlAspectEngine* engine = new QQmlAspectEngine( this );
  51. engine->aspectEngine( )->registerAspect( new QRenderAspect );
  52. engine->aspectEngine( )->registerAspect( new QInputAspect );
  53.  
  54. // 3
  55. QVariantMap data;
  56. data.insert( QStringLiteral( "surface" ),
  57. QVariant::fromValue( static_cast<QSurface*>( view3D ) ) );
  58. data.insert( QStringLiteral( "eventSource" ),
  59. QVariant::fromValue( view3D ) );
  60. engine->aspectEngine( )->setData( data );
  61.  
  62. // 4
  63. engine->qmlEngine( )->rootContext( )->setContextProperty( "_settings", &m_settings );
  64.  
  65. // 5
  66. engine->aspectEngine( )->initialize( );
  67. engine->setSource( QUrl( "qrc:/qml/main.qml" ) );
  68.  
  69. QVBoxLayout* l = qobject_cast<QVBoxLayout*>( ui->centralwidget->layout( ) );
  70. l->insertWidget( 0, QWidget::createWindowContainer( view3D ) );
  71. }
  72.  
  73. MainWindow::~MainWindow()
  74. {
  75. delete ui;
  76. }
  77.  
  78. void MainWindow::on_showModelButton_clicked()
  79. {
  80. bool show = m_settings.showModel( );
  81. show = !show;
  82. ui->showModelButton->setText( show? "隐藏模型": "显示模型" );
  83. m_settings.setShowModel( show );
  84. }

这里我们使用了QWindow来替代我们以前使用的QWidget,而且使用了QWidget:: createWindowContainer()函数来将QWindow的内容嵌入QWidget框架中;紧接着我们在构造函数中创建了QQmlAspectEngine类实例,而且注冊了QRenderAspect和QInputAspect。随后我们使用一个QVariantMap数据结构,将surface以及eventSource以键值对的形式存储起来供QAspectEngine使用。接着作为可选的内容,我们为了让C++这一部分控制QML。我们定义了一个Settings类,而且将m_settings注入QML环境作为上下文变量;最后我们使用initialize()函数初始化QAspectEngine,而且指定了我们须要展示的场景数据:main.qml。

此外。当button按下的时候,我们能够通过改变m_settings的属性从而控制我们是否想要显示模型。

同一时候我们还必须在main.qml中作一些设置:

  1.  
  1. import Qt3D 2.0
  2. import Qt3D.Renderer 2.0
  3.  
  4. Entity
  5. {
  6. id: root
  7.  
  8. Camera
  9. {
  10. id: camera
  11. position: Qt.vector3d( 0.0, 20.0, 100.0 )
  12. projectionType: CameraLens.PerspectiveProjection
  13. fieldOfView: 45
  14. aspectRatio: 16.0 / 9.0
  15. nearPlane : 0.1
  16. farPlane : 1000.0
  17. upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
  18. viewCenter: Qt.vector3d( 0.0, 20.0, 0.0 )
  19. }
  20.  
  21. components: FrameGraph
  22. {
  23. ForwardRenderer
  24. {
  25. clearColor: Qt.rgba( 0.2, 0, 0, 1 )
  26. camera: camera
  27. }
  28. }
  29.  
  30. Entity
  31. {
  32. Mesh
  33. {
  34. id: chestMesh
  35. source: "qrc:/assets/Chest.obj"
  36. enabled: _settings.showModel
  37. }
  38.  
  39. components: [ chestMesh ]
  40. }
  41.  
  42. Configuration
  43. {
  44. controlledCamera: camera
  45. }
  46. }
  1.  

如上面所看到的,我们在名为root的Entity中定义了一个摄像机、一个实体。另一些必要的设置。

同一时候我们通过绑定_settings.showModel来控制Mesh的显示或者隐藏。

本次教程的代码均在我的github中,感兴趣的同行们能够通过git clone或者是直接下载我的git项目来获取到本套教程的全部源码。

Qt 3D教程(二)初步显示3D的内容的更多相关文章

  1. Qt 3D教程(三)实现对模型材质參数的控制

    Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...

  2. qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件(有上千个下一代软件黑科技项目是qt的,美国宇航局,欧洲宇航局,超级战舰DDG1000)

    作者:Nebula.Trek链接:https://www.zhihu.com/question/24316868/answer/118944490来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  3. Unity在UI界面上显示3D模型/物体,控制模型旋转

    Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  4. 使用WPF实现3D场景[二]

    原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察. 首先看一下DEMO的界面:     ...

  5. C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

    C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...

  6. C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字

    C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用Poi ...

  7. C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字

    C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...

  8. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

  9. 《zw版·Halcon-delphi系列原创教程》 2d照片-3d逆向建模脚本

    <zw版·Halcon-delphi系列原创教程> 2d照片-3d逆向建模脚本 3D逆向建模,是逆向工程的核心要素.       3D逆向建模,除了目前通用的3D点云模式,通过2D图像实现 ...

随机推荐

  1. java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word

    1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...

  2. windows部署iBase4J

    所需环境:jdk 1.8.eclipse(myeclipse不可以).nginx.activeMQ .zookeeper.redis 第一步 下载jdk1.8 按步骤安装至指定位置即可 第二步 安装e ...

  3. 在Html5中与服务器交互

    转自原文 在Html5中与服务器交互 刚刚涉足职场,上头就要我研究HTML5,内嵌到手机上,这对我来说完全是一个陌生的领域,不过也正好给自己一个机会来学习,最近做到要跟服务器交互这部分,这部分可是卡了 ...

  4. HMM(隐马尔可夫),这篇讲的不错

    http://www.cnblogs.com/skyme/p/4651331.html

  5. yqj2065经典语录

    在上课时.博客中和<编程导论(Java)>书中,yqj2065说过一些简短的话.列举一些玩玩. 假设您在我的博客中看见好玩的,最好还是推荐一下. 持续加入中... 1. "噢姐姐 ...

  6. hdu5240

    想了辣么多 貌似就一个条件 #include<bits/stdc++.h> using namespace std; int flag=0;int main(){int t,n,kase= ...

  7. 手动配置IP网络

    1. #vi /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 是网卡的名字,根据自己的计算机 2. 修改配置 ONBOOT=no改为ONB ...

  8. 15-11-24 system同步与异步

    //打开关闭qq #define _CRT_SECURE_N0_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #i ...

  9. HD-ACM算法专攻系列(4)——A == B ?

    题目描述: 源码: /**/ #include"iostream" #include"string" using namespace std; string S ...

  10. C#调用webservice(一)

    最近一直在搞网络编程,这篇是关于webservice的,准备写两篇例子这篇是实现手机号码归宿地查询,下篇准备写实现机票查询. 这个网站(http://www.webxml.com.cn/zh_cn/i ...