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

前一篇非常简单,完全就没有牵涉到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的视图// 1View3D* view3D = new View3D;// 2QQmlAspectEngine* engine = new QQmlAspectEngine( this );engine->aspectEngine( )->registerAspect( new QRenderAspect );engine->aspectEngine( )->registerAspect( new QInputAspect );// 3QVariantMap data;data.insert( QStringLiteral( "surface" ),QVariant::fromValue( static_cast<QSurface*>( view3D ) ) );data.insert( QStringLiteral( "eventSource" ),QVariant::fromValue( view3D ) );engine->aspectEngine( )->setData( data );// 4engine->qmlEngine( )->rootContext( )->setContextProperty( "_settings", &m_settings );// 5engine->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。

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

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

import Qt3D 2.0
import Qt3D.Renderer 2.0Entity
{id: rootCamera{id: cameraposition: Qt.vector3d( 0.0, 20.0, 100.0 )projectionType: CameraLens.PerspectiveProjectionfieldOfView: 45aspectRatio: 16.0 / 9.0nearPlane : 0.1farPlane : 1000.0upVector: 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: chestMeshsource: "qrc:/assets/Chest.obj"enabled: _settings.showModel}components: [ chestMesh ]}Configuration{controlledCamera: camera}
}

如上面所示,我们在名为root的Entity中定义了一个摄像机、一个实体,还有一些必要的设置。同时我们通过绑定_settings.showModel来控制Mesh的显示或者隐藏。

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

Qt 3D教程(二)初步显示3D的内容相关推荐

  1. 3D教程:浩辰3D软件[零件族],你无法拒绝的高效工具!

    最近,印度对于中国制造的各种产品开始全面抵制,从APP应用,到生活日用品.家电.汽车等,无不与民众的生活息息相关.那么印度制造真的能取代中国制造嘛?答案不言而喻:理想很丰满,现实却很骨感. 中国从一个 ...

  2. Qt 3D教程(一)使用Qt Widgets建立一个框架

    Qt3D教程(一)使用Qt Widgets建立一个框架 Qt 3D是Qt 5.5发布时最重要的一个新模块,它很好地将3D的繁文缛节封装在底层,留给我们的是简洁的对象创建方法,它也不需要你掌握太多的着色 ...

  3. Qt 3D的研究(三):显示3D模型

    原文地址::https://blog.csdn.net/gamesdev/article/details/43964499 相关文章 1.Qt之实现3D纹理渲染自由旋转空间立方体----https:/ ...

  4. Qt 3D教程(四)结合Qt Quick来实现动画的效果

    Qt 3D教程(四)结合Qt Quick来实现动画的效果 上篇教程已经给大家带来较为实用的效果了,这回我们尝试载入两个模型,并且让PhongMaterial成为它们的共享材质,此外,我们通过借助Qt ...

  5. 3D目标检测深度学习方法之voxel-represetnation内容综述(二)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 前面的一篇文章:3D目标检测深度学习方法中voxel-represetnation内容综述(一) ...

  6. opengl加载显示3D模型DXF类型文件

    opengl加载显示3D模型DXF类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示DXF格式的三维模型文件,DXF也有三维的,大部分是二 ...

  7. Qt Creator在设计模式下编辑3D资产

    Qt Creator在设计模式下编辑3D资产 在设计模式下编辑3D资产 在设计模式下编辑3D资产 Qt Design Studio将在设计模式下打开包含3D场景和3D编辑器中的场景的QML文件.您可以 ...

  8. QT实现带有阴影的渲染3D场景

    QT实现带有阴影的渲染3D场景 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 一个Qt 3D QML应用程序,说明了如何在带有阴影的Qt 3D中渲染场景. Qt 3 ...

  9. 浩辰3D软件入门教程:如何比较3D模型?

    在初始设计.验证.变更.发布.优化等整个产品生命周期内,设计方案会经历无数次的调整.而由此产生的多版本3D模型数据或二维CAD图纸,已经很难凭借肉眼.记忆.经验等人工辨别方式进行精确区分和全面分析. ...

最新文章

  1. linux 不关机添加硬盘,完美解决Ubuntu Linux关机异响[SATA硬盘]
  2. nginx log response_python+pandas分析nginx日志的实例
  3. 今天,神策数据官网银行 Demo 正式上线!
  4. 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入
  5. discuz 版块导航function_forumlist.php,Discuz! X2“扩建”左侧版块导航 让社区层次一目了然...
  6. python/c++计算psnr
  7. 川渝严重高温伏旱根源:全球气候变暖导致灾情频发
  8. Java 中初始化 List 集合的 7 种方式
  9. linux系统oracle监听启动,linux下启动与关闭oracle监听与实例
  10. [Tyvj模拟赛]运
  11. 李飞飞等6名华人入选ACM 2018 Fellow,无国内学者入选
  12. hdu3729(二分图)
  13. 从使用Python开发一个Socket示例说到开发者的思维和习惯问题
  14. lazada新手卖家必看!教你快速入门东南亚lazada平台
  15. Java速成系列-02-Java的版本
  16. 如何查看mysql的gtid_mode_配置MHA开启主从同步的时候会提示从库gtid_mode为ON的状态...
  17. opencv-contours轮廓提取
  18. 线程、多线程、线程池总结
  19. C#之HC-05蓝牙配对助手
  20. 【单目摄像头测量距离:相似三角形法】

热门文章

  1. 五金配件行业ERP解决方案
  2. 网上投简历的潜规则-以智联招聘、前程无忧等为例
  3. js调用原生API--陀螺仪和加速器
  4. vue14 动画-自学视频
  5. C++ allocator设计内存管理器
  6. STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
  7. 软件主管离职后非法获取海量客户信息牟利
  8. android 在窗口中启动应用程序,Android中使用am命令实现在命令行启动程序详解
  9. 山东省计算机网络与信息安全管理,山东省委网信办和国家计算机网络与信息安全管理中心山东分中心签署协议 将在这四方面展开合作...
  10. 计算机技术专业 英文,计算机技术与应用专业英文简历模板