zoukankan      html  css  js  c++  java
  • Qt 3D入门(一)

    最近工作中可能需要用到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)。

     1 #include <Qt3DQuickExtras/qt3dquickwindow.h>
     2 #include <QGuiApplication>
     3  
     4 int main(int argc, char* argv[])
     5 {
     6     QGuiApplication app(argc, argv);
     7     Qt3DExtras::Quick::Qt3DQuickWindow view;
     8     view.setSource(QUrl("qrc:/main.qml"));
     9     view.show();
    10  
    11     return app.exec();
    12 }

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

     1 import QtQuick 2.2 as QQ2
     2 import Qt3D.Core 2.0
     3 import Qt3D.Render 2.0
     4 import Qt3D.Input 2.0
     5 import Qt3D.Extras 2.0
     6  
     7 Entity {
     8     id: sceneRoot
     9  
    10     Camera {
    11         id: camera
    12         projectionType: CameraLens.PerspectiveProjection
    13         fieldOfView: 45
    14         aspectRatio: 16/9
    15         nearPlane : 0.1
    16         farPlane : 1000.0
    17         position: Qt.vector3d( 0.0, 0.0, -40.0 )
    18         upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
    19         viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
    20     }
    21  
    22     OrbitCameraController {
    23         camera: camera
    24     }
    25  
    26     components: [
    27         RenderSettings {
    28             activeFrameGraph: ForwardRenderer {
    29                 clearColor: Qt.rgba(0, 0.5, 1, 1)
    30                 camera: camera
    31             }
    32         },
    33         // Event Source will be set by the Qt3DQuickWindow
    34         InputSettings { }
    35     ]
    36 }

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

    
    
  • 相关阅读:
    编程语言的简介
    ava 8 stream的详细用法
    Java 8 Steam 例子整理
    redis常用命令
    常用正则表达式
    保留一些常用文章
    tag的简单使用
    GitFlow详解教程
    Git基本命令和GitFlow工作流
    Redis 2.8.18 安装报错 error: jemalloc/jemalloc.h: No such file or directory
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14376084.html
Copyright © 2011-2022 走看看