qt3d教程初步显示3d的内容

mfmdaoyou mfmdaoyou     2022-09-02     606

关键词:

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


在 Qt3D 场景上绘制 2D 图形的最佳方法是啥?

...它在我的Qt应用程序中使用QWidget::createWindowContainer(QWindow*)显示为小部件。在 查看详情

在 Qt3D 中找不到适合 QUrl 的导入器插件 - .dae 对象

...】:我想学习Qt尤其是3D功能,因此关注了thistutorial。本教程的一部分是从名为object.dae的.dae文件中显示网格。当我第一次尝试运行我的代码时,出现以下错误:2:25:52:Sta 查看详情

如何使用qml qt3d(qt)将对象旋转一个角度?

...。我正在使用Qt/QML/Qt3D。我编写了一些代码here在对象窗口显示屏幕中添加一个按钮。借助此按钮,我可以将显示屏中的对象旋转大约(90和180)度。QML源代码:importQtQ 查看详情

如何在 Qt3D 中创建撤消/重做操作? [关闭]

...述】:我在QML中使用qt3d创建了一些实体。例如,此代码显示了一个声明RootEntity的Scene3D元素,这是另一个包含场景图的QML元素:Scene3Did:scene3danchors.fill:parentfocus: 查看详情

将 Qt3D 用于巨大的地形模型?

】将Qt3D用于巨大的地形模型?【英文标题】:UsingQt3Dforahugetopographymodel?【发布时间】:2020-04-0812:39:47【问题描述】:我的场景目前包含一个巨大的地形模型(Mill.Verticies)。现在场景变得更加复杂并包含许多较小的3D对象。从QFra... 查看详情

qtcanvas3d和qt3d的区别

qtcanvas3d更底层些,qt3d更高层些。都是基于OpenGL。qtcanvas3d基于webgl.qt3d创建基本实体比较麻烦。qtcanvas3d这方面相对好点。参考技术A先打开一个网站..然后在里面打开另一个..点另一个的一个角..逐渐拉小..然后全部关掉就可以了希... 查看详情

Qt3D 是 Qt5 的一部分吗?

】Qt3D是Qt5的一部分吗?【英文标题】:IsQt3DapartofQt5?【发布时间】:2013-01-1420:57:15【问题描述】:我已经在windows中安装了Qt5库,但是Qt助手中没有关于Qt3D的文档。Qt3D是Qt5的一部分还是已从发布版本5中删除?【问题讨论】:只想... 查看详情

windows下为android部署qt3d项目

】windows下为android部署qt3d项目【英文标题】:Deployingqt3dprojectforandroidunderwindows【发布时间】:2013-11-1215:24:53【问题描述】:我正在尝试在Windows下使用qt5和qt3d在android上部署测试程序。构建qt3d是成功的,仍然需要手动将库和源复... 查看详情

Qt3D:根据实体和相机之间的距离缩放实体大小

】Qt3D:根据实体和相机之间的距离缩放实体大小【英文标题】:Qt3D:Scaleentitysizeaccordingtoadistancebetweenentityandcamera【发布时间】:2018-08-3008:15:42【问题描述】:在代码中调整实体大小很容易:self.transform=Qt3DCore.QTransform()self.transform.... 查看详情

qt3d学习

(持续更新)Qt3D学习资源-行者孙-博客园 查看详情

qt3d学习

(持续更新)Qt3D学习资源-行者孙-博客园 查看详情

Qt 5.5 的 Qt3D 示例中的 ForwardRenderer 是啥?

】Qt5.5的Qt3D示例中的ForwardRenderer是啥?【英文标题】:WhatisForwardRendererinQt5.5\'sQt3Dexamples?Qt5.5的Qt3D示例中的ForwardRenderer是什么?【发布时间】:2015-11-1806:34:59【问题描述】:AssimpexampleofQt3dofQt5.5usesForwardRenderer.我复制了代码,并在... 查看详情

qt3d场景快速绘制入门学习

...; 使用QTOpenGL模块(QOpenGLWidget等)2)   使用QT3DC++类(QEntiry等)3)   使用QT3DQML类(Entity等) QT3D场景提供了一种快速设置3D场景的一种方式,用户凭借着封装好的实体可以快速的在顶层实体(画布)当... 查看详情

通过 Qt3D 模块导入 STL 文件:如何配置灯光和材质

】通过Qt3D模块导入STL文件:如何配置灯光和材质【英文标题】:ImportSTLfilesbyQt3Dmodule:howtodoconfigurationoflightandmaterial【发布时间】:2018-06-2814:19:20【问题描述】:我使用某人上传的代码hereonBitbucket用Qt3D打开和查看STL文件。代码中... 查看详情

qt3d用c++输入(代码片段)

是否可以在c++中处理qt3d中的鼠标输入?我可以使用qt3drepo中的样本使用qmlhttps://github.com/qtproject/qt3d/tree/5.6/examples/qt3d/mouseinput-qml然而,没有c++等价物。尽管经过多次尝试(甚至尝试使用附加到各种小部件的事件过滤器捕获输入)... 查看详情

Qt3D:如何将 Scene2D 缩放为与窗口相同的大小(逐像素)?

】Qt3D:如何将Scene2D缩放为与窗口相同的大小(逐像素)?【英文标题】:Qt3D:HowtoscaleaScene2Dtobethesamesizeasthewindow(pixel-wise)?【发布时间】:2020-11-1900:29:33【问题描述】:我创建了一个带有800x600窗口的C++应用程序,它使用QtQuick2元... 查看详情

Qt3D 应用程序在任何按钮按下时触发系统声音

】Qt3D应用程序在任何按钮按下时触发系统声音【英文标题】:Qt3Dapptriggerssystemsoundsonanybuttonpress【发布时间】:2017-01-0710:12:41【问题描述】:我查看了Qt3D模块的标准示例,但按下任何按钮都会触发烦人的osX系统声音,即按下错误... 查看详情

带有几个键的 QT3D QML RenderPassFilter 似乎有问题

】带有几个键的QT3DQMLRenderPassFilter似乎有问题【英文标题】:QT3DQMLRenderPassFilterwithseveralkeyseemsbugged【发布时间】:2017-06-0115:16:23【问题描述】:我刚开始使用QML创建QT3D场景。我想过滤使用RenderPassFilter渲染场景的哪些元素。这是... 查看详情