Qt 3D教程(二)初步显示3D的内容
Qt3D教程(二)初步显示3D的内容
前一篇很easy,全然就没有牵涉到3D的内容,它仅仅是我们搭建3D应用的基本框架而已,而这一篇。我们将要利用它来初步地显示3D的内容了!
本次目的是将程序中间的内容替换成3D的视图,而这一切也只是十几行代码。要不我们来试一试吧!
蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131099。欢迎同行前来探讨。
首先我们须要对我们的MainWindow.cpp文件进行改动,在此基础上加入一些内容:
- #include <QQmlAspectEngine>
- #include <QRenderAspect>
- #include <QInputAspect>
- #include <QQmlContext>
- #include <QWindow>
- #include "MainWindow.h"
- #include "ui_MainWindow.h"
- class View3D: public QWindow
- {
- public:
- View3D( QScreen* targetScreen = Q_NULLPTR ): QWindow( targetScreen )
- {
- setSurfaceType( QSurface::OpenGLSurface );
- QSurfaceFormat format;
- format.setSamples( 4 );
- setFormat( format );
- create( );
- }
- };
- Settings::Settings( QObject* parent ): QObject( parent )
- {
- m_showModel = true;
- }
- void Settings::setShowModel( bool showModel )
- {
- if ( m_showModel == showModel ) return;
- m_showModel = showModel;
- emit showModelChanged( );
- }
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- using namespace Qt3D;
- using namespace Qt3D::Quick;
- // 创建一个3D的视图
- // 1
- View3D* view3D = new View3D;
- // 2
- QQmlAspectEngine* engine = new QQmlAspectEngine( this );
- engine->aspectEngine( )->registerAspect( new QRenderAspect );
- engine->aspectEngine( )->registerAspect( new QInputAspect );
- // 3
- QVariantMap data;
- data.insert( QStringLiteral( "surface" ),
- QVariant::fromValue( static_cast<QSurface*>( view3D ) ) );
- data.insert( QStringLiteral( "eventSource" ),
- QVariant::fromValue( view3D ) );
- engine->aspectEngine( )->setData( data );
- // 4
- engine->qmlEngine( )->rootContext( )->setContextProperty( "_settings", &m_settings );
- // 5
- engine->aspectEngine( )->initialize( );
- engine->setSource( QUrl( "qrc:/qml/main.qml" ) );
- QVBoxLayout* l = qobject_cast<QVBoxLayout*>( ui->centralwidget->layout( ) );
- l->insertWidget( 0, QWidget::createWindowContainer( view3D ) );
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::on_showModelButton_clicked()
- {
- bool show = m_settings.showModel( );
- show = !show;
- ui->showModelButton->setText( show? "隐藏模型": "显示模型" );
- m_settings.setShowModel( show );
- }
这里我们使用了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中作一些设置:
- import Qt3D 2.0
- import Qt3D.Renderer 2.0
- Entity
- {
- id: root
- Camera
- {
- id: camera
- position: Qt.vector3d( 0.0, 20.0, 100.0 )
- projectionType: CameraLens.PerspectiveProjection
- fieldOfView: 45
- aspectRatio: 16.0 / 9.0
- nearPlane : 0.1
- farPlane : 1000.0
- upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
- viewCenter: Qt.vector3d( 0.0, 20.0, 0.0 )
- }
- components: FrameGraph
- {
- ForwardRenderer
- {
- clearColor: Qt.rgba( 0.2, 0, 0, 1 )
- camera: camera
- }
- }
- Entity
- {
- Mesh
- {
- id: chestMesh
- source: "qrc:/assets/Chest.obj"
- enabled: _settings.showModel
- }
- components: [ chestMesh ]
- }
- Configuration
- {
- controlledCamera: camera
- }
- }
如上面所看到的,我们在名为root的Entity中定义了一个摄像机、一个实体。另一些必要的设置。
同一时候我们通过绑定_settings.showModel来控制Mesh的显示或者隐藏。
本次教程的代码均在我的github中,感兴趣的同行们能够通过git clone或者是直接下载我的git项目来获取到本套教程的全部源码。
Qt 3D教程(二)初步显示3D的内容的更多相关文章
- Qt 3D教程(三)实现对模型材质參数的控制
Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...
- qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件(有上千个下一代软件黑科技项目是qt的,美国宇航局,欧洲宇航局,超级战舰DDG1000)
作者:Nebula.Trek链接:https://www.zhihu.com/question/24316868/answer/118944490来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...
- Unity在UI界面上显示3D模型/物体,控制模型旋转
Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- 使用WPF实现3D场景[二]
原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察. 首先看一下DEMO的界面: ...
- C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图
C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...
- C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字
C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用Poi ...
- C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字
C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...
- Civil 3D API二次开发学习指南
Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...
- 《zw版·Halcon-delphi系列原创教程》 2d照片-3d逆向建模脚本
<zw版·Halcon-delphi系列原创教程> 2d照片-3d逆向建模脚本 3D逆向建模,是逆向工程的核心要素. 3D逆向建模,除了目前通用的3D点云模式,通过2D图像实现 ...
随机推荐
- java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word
1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...
- windows部署iBase4J
所需环境:jdk 1.8.eclipse(myeclipse不可以).nginx.activeMQ .zookeeper.redis 第一步 下载jdk1.8 按步骤安装至指定位置即可 第二步 安装e ...
- 在Html5中与服务器交互
转自原文 在Html5中与服务器交互 刚刚涉足职场,上头就要我研究HTML5,内嵌到手机上,这对我来说完全是一个陌生的领域,不过也正好给自己一个机会来学习,最近做到要跟服务器交互这部分,这部分可是卡了 ...
- HMM(隐马尔可夫),这篇讲的不错
http://www.cnblogs.com/skyme/p/4651331.html
- yqj2065经典语录
在上课时.博客中和<编程导论(Java)>书中,yqj2065说过一些简短的话.列举一些玩玩. 假设您在我的博客中看见好玩的,最好还是推荐一下. 持续加入中... 1. "噢姐姐 ...
- hdu5240
想了辣么多 貌似就一个条件 #include<bits/stdc++.h> using namespace std; int flag=0;int main(){int t,n,kase= ...
- 手动配置IP网络
1. #vi /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 是网卡的名字,根据自己的计算机 2. 修改配置 ONBOOT=no改为ONB ...
- 15-11-24 system同步与异步
//打开关闭qq #define _CRT_SECURE_N0_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #i ...
- HD-ACM算法专攻系列(4)——A == B ?
题目描述: 源码: /**/ #include"iostream" #include"string" using namespace std; string S ...
- C#调用webservice(一)
最近一直在搞网络编程,这篇是关于webservice的,准备写两篇例子这篇是实现手机号码归宿地查询,下篇准备写实现机票查询. 这个网站(http://www.webxml.com.cn/zh_cn/i ...