欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt5.11 Qt 3D入门(一)

程序员文章站 2022-03-20 11:26:06
...

最近工作中可能需要用到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的模板,只能任意拿一个最相近的模板来改啦。

Qt5.11 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程序就出来了。以后也可以把它作为一个模板,在这上面添加功能。

Qt5.11 Qt 3D入门(一)

相关标签: Qt 3D