Qt 3D的研究(二)

原创 2015年02月13日 21:47:48

Qt 3D的研究(二)

       上一篇文章给大家看了很多Qt 3D的例子,如果大家有Qt 3D的源代码,就会发现,开发这些例子,花费的代码还真不少。这就是不一样的地方,Qt 3D毕竟和三维图形打交道,多了一个维度,问题的难度变得更大了。

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

       研究了多日的Qt 3D,我了解到为了适应跨平台、不同的着色器编译器标准、多重渲染目标,Qt 3D提出了很多的方案,创新了许多的概念,这多多少少让初学者感到困难重重。在与Qt开发者经过jira以及IRC等交流后,我了解到了如何使用Qt 3D构建一个简单的程序。

       这个程序呢,虽然说简单,但是是Qt 3D中精简的最少代码了。让我们首先看看main.qml。

import Qt3D 2.0
import Qt3D.Render 2.0

Entity
{
    components: FrameGraph
    {
        ForwardRenderer
        {
            clearColor: Qt.rgba( 0.2, 0, 0, 1 )
        }
    }
}

       Qt 3D和其它的库不一样,它的main.qml放的是Entity,而不是我们常见的Window或者ApplicationWindow。其次,我们看到他里面没有QtQuick的引用。这个可能因为Qt3D不直接建立在QtQuick上,而是建立在了QtQml模块上,所以提供了QML的语法,但是我们看不见常见的QtQuick类型比如说Item什么的。这两个变化是第一眼看出来比较明显的。

       接下来介绍一下Qt 3D的FrameGraph,前段时间我为了深入研究QtQuick的渲染,曾经研究了Qt的SceneGraph框架。后面发现在SceneGraph下进行渲染,还是有种种限制,无法更好地渲染出漂亮的3D图形出来。于是,我开始离开Scene Graph,转向使用原生OpenGL进行渲染,以及开始接触Qt3D的FrameGraph。在介绍Qt3D的英文博客中,作者更是说明,SceneGraph能让我们用数据驱动的方式告诉我们要渲染什么东西,而Frame Graph能让我们用数据驱动的方式告诉我们怎样渲染。这是一个比较大,也比较难的转变。尝试做一个Qt 3D框架的人都有此感。想要拥有一个什么都可以configurable(可配置)的框架,自己制作起来是多么难。FrameGraph,则是告诉底层渲染器,我们需要怎样渲染,效果是怎么样的。在FrameGraph中,只有ForwardRenderer,告诉我们按照普通前向渲染的方式进行。里面我们指定了一个刷新的颜色。估计是采用glClearColor这个API指定的吧。

       接下来我们转向C++。C++这边也和普通的Quick程序不一样了。

#include <QApplication>
#include <QDesktopWidget>
#include <QQmlApplicationEngine>
#include <Window>
#include <QRenderAspect>
#include <QInputAspect>
#include <QQmlAspectEngine>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Qt3D::Window window;
    Qt3D::Quick::QQmlAspectEngine engine;
    engine.aspectEngine( )->registerAspect( new Qt3D::QRenderAspect );
    engine.aspectEngine( )->registerAspect( new Qt3D::QInputAspect );
    engine.aspectEngine( )->initialize( );

    QVariantMap data;
    data.insert( QStringLiteral( "surface" ),
                 QVariant::fromValue( static_cast<QSurface*>( &window ) ) );
    data.insert( QStringLiteral( "eventSource" ),
                 QVariant::fromValue( &window ) );
    engine.aspectEngine( )->setData( data );

    engine.aspectEngine( )->initialize( );
    engine.setSource( QUrl( "qrc:/main.qml" ) );

    // 让窗口以一定的大小居中显示
    int clientWidth = app.desktop( )->availableGeometry( ).width( );
    int clientHeight = app.desktop( )->availableGeometry( ).height( );
    int windowWidth = 480;
    int windowHeight = 320;

    window.setGeometry( ( clientWidth - windowWidth ) / 2,
                        ( clientHeight - windowHeight ) / 2,
                        windowWidth,
                        windowHeight );
    window.show( );

    return app.exec( );
}


       我们使用的引擎不是简单的QQmlApplicationEngine类,而是Qt3D::Quick::QqmlAspectEngine类。这里有一个重要的概念——面向方面。所以在其中你看到很多Aspect字眼。这是因为我们将一个实体(Entity)分成很多组件(Component),其中有很多组件组合起来成为一个方面,剩下的组成另外一个方面。比如说Qt 3D有核心方面、渲染方面、声音方面、输入方面、Quick渲染方面。它们被组成一个个库,根据用户的需求来链接。

       当然,作为Qt 3D的核心,Qt 3D必须要一个窗口来显示。Qt3D自己封装了一个窗口,名叫Qt3D::Window,它也不继承QQuickWindow,而是继承它的父类QWindow。目前window的信息,还是需要显式写入引擎的data中。最后引擎设置一下qml文件,接下来设置一下窗口大小和方位就可以正常显示了。

       程序的截图如下所示:

       虽然不是那么激动人心,但是这的确是能运行Qt 3D程序最少的代码了。

       想要了解更多Qt 3D的介绍,推荐大家看KDAB的博客。

Overview of Qt3D 2.0 –Part 1

Overview of Qt3D 2.0 –Part 2

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

上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用。和大家最初接触的glut一样,对于3D应用来说,需要做的准备工作还真不少,不过呢,Qt 3D把一些窗口相关的琐碎事情解决了,剩下的,该由我们...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年02月27日 09:59
  • 9844

Qt 3D Overview

Qt3D建立的目标是能够让开发者快速地创建3D场景,通过各式各样的渲染技术来达到3D交互的场景。Qt3D除了和Qt一样跨平台之外,还能够选择OpenGL的具体实现,定制GLSL,从而能够根据不同性能的...
  • lizhenneng
  • lizhenneng
  • 2016年05月10日 16:06
  • 3200

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

前一篇非常简单,完全就没有牵涉到3D的内容,它只是我们搭建3D应用的基本框架而已,而这一篇,我们将要利用它来初步地显示3D的内容了!本次目的是将程序中间的内容替换成3D的视图,而这一切也不过十几行代码...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年07月29日 17:30
  • 7509

Qt 3D的研究(一)

Qt 3D是有可能即将在Qt 5.5中正式启用的模块之一。它建立的目标是能够让开发者快速地创建3D场景,通过各式各样的渲染技术来达到3D交互的场景。Qt3D除了和Qt一样跨平台之外,还能够选择Open...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年02月13日 20:45
  • 8035

字符集问题的初步探讨(四

 HTML Tags and JavaScript tutorialvar encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%...
  • lxf464300
  • lxf464300
  • 2007年10月15日 22:55
  • 217

Qt3D for QT 5

http://blog.sina.com.cn/s/blog_88e2dbbf0101hzx7.html
  • chenyijun
  • chenyijun
  • 2014年09月29日 00:11
  • 1709

Qt3D的研究

Qt3D
  • tony2278
  • tony2278
  • 2016年09月13日 17:46
  • 685

Qt3D与2D交互

  • 2014年07月10日 20:08
  • 3.33MB
  • 下载

Qt 3D的研究(七):渲染至纹理

最近几天都没有怎么研究Qt 3D了,但是随着Qt5.5发布的日子一天天的靠近,我也不能懈怠,希望利用Qt 3D,将能够实现的功能进行实现,并且对Qt 3D获取一个新的认识。两天多没有研究了,现在信心却...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年03月09日 16:44
  • 2785

Qt 3D的研究(四):指定渲染的材质以及效果

在上一篇文章中我了解到了怎样简单地显示模型。Qt3D内置了一个obj模型的解析器,这样可以将简单的obj模型载入并且显示出来。其实Qt3D对于渲染的配置还是很厉害的,通过设定材质,我们可以得到很不错的...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年02月28日 11:16
  • 3892
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 3D的研究(二)
举报原因:
原因补充:

(最多只允许输入30个字)