Qt5.11 Qt 3D入门(一)

4 篇文章 1 订阅

最近工作中可能需要用到3D技术,虽然在工作中使用Qt的年限超过了十年,但对3D技术还是非常陌生的,有很多知识需要恶补。

研究了几天的Qt 3D,包括Qt 3D Studio,总算有了一些眉目,但需要恶补的知识还非常多,后面再说吧。

Qt 3D不仅可以使用C++来进行编程,更方便的还是使用Qt Quick,对于一个十几年都是用Widget来写界面的人,又是一个头大的事,虽然这应该说是一个更现代的方法,程序与界面分得更加清楚,但很多思维方法比较难转过弯来。其实说白了就是对它不熟,就不太愿意去用,用起来很别扭。

但现在要使用Qt 3D的话,还是逼着自己学一下吧。

1. 新建一个Qt Quick Application - Empty的工程,Qt Creator现在还没有Qt 3D的模板,只能任意拿一个最相近的模板来改啦。

没有特别要求的话,后面的设置都用默认也可以。

2. 修改.pro文件,主要加入3d的库支持,在任意位置加入下面一行

QT += 3dcore 3drender 3dinput 3dquick 3dlogic qml quick 3dquickextras 3dextras

3. 修改main.c文件,全部清空,然后使用下面的代码,以后有个模板就不需要改这些了。

Qt 3D使用Qt3DExtras::Quick::Qt3DQuickWindow作为程序的主窗口,加载qrc:/main.qml作为界面文件,进行显示。与QWidget和Qt Quick的方式非常类似,也非常简洁和优美。Qt3DExtras模块提供了一套编译好的用于开发Qt 3D程序的要素,当然,它仍然还在开发之中,随时可能会改变。这些要素包括实体(Entity)、材质(Materials)、模型(Meshes and Geometries)、相机(Camera Controllers)、窗口(Window)和渲染器(FrameGraphs)。

#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <QGuiApplication>

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Quick::Qt3DQuickWindow view;
    view.setSource(QUrl("qrc:/main.qml"));
    view.show();

    return app.exec();
}

4. 修改main.qml文件,全部清空,然后使用下面的代码。

import QtQuick 2.2 as QQ2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0

Entity {
    id: sceneRoot

    Camera {
        id: camera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: 16/9
        nearPlane : 0.1
        farPlane : 1000.0
        position: Qt.vector3d( 0.0, 0.0, -40.0 )
        upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
        viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
    }

    OrbitCameraController {
        camera: camera
    }

    components: [
        RenderSettings {
            activeFrameGraph: ForwardRenderer {
                clearColor: Qt.rgba(0, 0.5, 1, 1)
                camera: camera
            }
        },
        // Event Source will be set by the Qt3DQuickWindow
        InputSettings { }
    ]
}

QEntity是Qt3DCore::QNode的子类,可以集合多个Qt3DCore::QComponent实例,并由这些实例定义它的行为。本质上,QEntity只是一个空壳,它的行为由QComponent定义。Qt3D后端将解析和处理QEntity,识别有哪些QComponent,然后调用相应的aspect去执行,比如有的aspect专门处理QComponent的变形(Qt3DCore::QTransform),而另外有一个aspect专门处理鼠标事件(Qt3DInput::QMouseHandler)。

上面的代码定义了一个Camera和一个Renderer,Camera的参数定义了它是一个16:9,视角为45度,视点中心在原点,位置在(0,0,-40)的Camera;Render是一个ForwardRenderer,告诉我们按照普通前向渲染的方式进行,里面我们指定了一个刷新的颜色clearColor。ForwardRenderer是FrameGraph的默认实现,也是OpenGL传统使用的方式。它一次渲染一个物体对象,默认情况下,视窗占据整个屏幕,默认的颜色是白色。

5. 搞定,一个最简单的Qt 3D程序就出来了。以后也可以把它作为一个模板,在这上面添加功能。

  • 8
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值