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项目来获取到本套教程的全部源码。

时间: 2024-11-17 07:54:01

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

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

Qt 3D教程(三)实现对模型材质参数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. 上一篇教程介绍的是显示一个三维模型的基本步骤,接下来我们需要实现的是添加材质,并且希望我们通过按钮来控制材质的参数.这样的效果看起来很像一个3D模型材质编辑器的样子.那我们来尝试一下吧. 首先我们对Settings这个类进行修改,给它增添一些属性,比如说环境光.漫反射.镜面反射以及反射系数.通过Q

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

Qt3D教程(一)使用Qt Widgets建立一个框架 Qt 3D是Qt 5.5发布时最重要的一个新模块,它很好地将3D的繁文缛节封装在底层,留给我们的是简洁的对象创建方法,它也不需要你掌握太多的着色器知识,只需要懂得一些三维和光照的基本知识就可以创建出比较美观的三维模型浏览程序了.目前虽然大家都能够使用Qt 5.5和Qt 3D了,但是我查看了一下,有关API文档和一个详尽的介绍还是空缺的,因此我认为有必要写一点教程,简要介绍一下Qt 3D的使用方法. 蒋彩阳原创文章,首发地址:http://b

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

Qt 3D研究(三):显示3D模型 上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用.和大家最初接触的glut一样,对于3D应用来说,需要做的准备工作还真不少,不过呢,Qt 3D把一些窗口相关的琐碎事情解决了,剩下的,该由我们完成重要的渲染部分了,可以说,带来了某种程度的方便. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43964499.欢迎同行前来探讨. 我们接下来要使用Qt 3D将一个模型显示出来.Qt 3

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

Qt 3D教程(四)结合Qt Quick来实现动画的效果 上篇教程已经给大家带来较为实用的效果了,这回我们尝试载入两个模型,并且让PhongMaterial成为它们的共享材质,此外,我们通过借助Qt Quick的动画框架来让我们的三维场景动起来! 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47132099.欢迎同行前来探讨. 这次的改动没有上次那么多,只需要修改main.qml即可满足效果.main.qml文件如下所示:

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

作者:Nebula.Trek链接:https://www.zhihu.com/question/24316868/answer/118944490来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件.日常生活中所用的qt产品比较少.也就virtual box,google earth,VLC player等.但是大型系统就正好相反,这是c++决定的,而非qt. 除了Maya之外,包括Houdini,斯特拉电车的系

《zw版&#183;Halcon-delphi系列原创教程》 2d照片-3d逆向建模脚本

<zw版·Halcon-delphi系列原创教程> 2d照片-3d逆向建模脚本 3D逆向建模,是逆向工程的核心要素.       3D逆向建模,除了目前通用的3D点云模式,通过2D图像实现快速3D建模,也是目前的重要手段.       2D图像的3D逆向建模,目前常用的有两种模式,一个是左右视距(或多角度取景)图片叠加处理,google的卫星地图3D化,就是这个模式.       另外一种,就是本文要介绍的3D定标模式(handeye??模式),就是在现场先拍摄一张标准3D定标图片,获取定位参

ArcGIS API for JavaScript 4.2学习笔记[2] 显示3D地图

3D地图又叫场景. 由上一篇可知, require入口函数的第一个参数是字符串数组 ["esri/Map", "esri/views/MapView", "dojo/domReady!"] 这里,MapView就是2D的地图视图. 所以,将2D地图改为3D地图,其实很简单,只需要把这个字符串数组的第二个引用改为"esri/views/SceneView" 然后在第二个参数中修改对应的view代码即可. 下面给出第二个参数(函数

Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决

一直以来很多Stage3D开发者都在为3D模型在2DUI上显示的问题头疼.Stage3D一直是在 Stage2D下面.为了做到3D模型在2DUI上显示通常大家有几种实现方式,下面来说说这几种实现方式吧. 实现方式1: 在2DUI上挖个洞透过去显示3D层.这种做法的缺陷在于如果两个UI界面同时打开就会UI错层显示错乱.为了解决这问题很多程序员选择了当挖洞显示3D的UI打时把其他界面隐藏掉,用户体验超差. 实现方式2: 利用Context3D 的 drawToBitmapData API 实时将3D

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

C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用PointSprite绘制文字,这可以只用1个点绘制文字,并确保文字始终面相窗口.用PointSprite绘制的文字,其大小范围有限,本篇提供的Demo中,Max Row Width最大只有256.现在能够绘制少量的文字,为其指定的位置的过程与为一个点指定位置的过程是相同的,所以此方式的应用范围还是比较广