zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt Quick 3D简介

Qt3D 简介 Quick
2023-09-14 09:05:12 时间

Qt Quick 3D简介

前言

Qt Quick 3D是Qt自带的一套3D图形系统,与传统的Qt 3D不同的是,Qt Quick 3D采用QML来进行开发。本节则对Qt Quick 3D进行一次简单的介绍。

配置场景

在main.qml中设置整个场景(entire scene)。

在使用Qt Quick 3D之前,为了能够使用QtQuick3D模块中的类型,我们必须导入它:

 import QtQuick
 import QtQuick3D

为了绘制任何3D场景,我们需要在Qt Quick场景中有一个3D视口。这是由View3D类提供的,这是我们定义场景的地方。在一个应用程序中也可以有多个视图。

首先需要从定义场景的环境开始,用天蓝色清除背景颜色。这里在SceneEnvironment中为视图的environment属性指定了天蓝色。SceneEnvironment描述了与场景环境相关的各种属性,如色调映射设置,基于图像照明的光探针设置,背景模式,或环境遮挡参数。除此之外,它还可以控制抗走样。在这里设置clearColor和backgroundMode属性以获得蓝色背景。

 environment: SceneEnvironment {
     clearColor: "skyblue"
     backgroundMode: SceneEnvironment.Color
 }

Meshes网格

在之前的文章中已经介绍过3D模型需要转换为.mesh文件然后传递给QML进行使用。

为了使场景更有趣一点,需要添加一些网格。在Quick 3D中有许多方便的内置网格,例如球体、立方体、圆锥或圆柱体。这些是通过使用特殊的标识符来引用的,比如在模型节点的源属性中使用#Sphere,#Cube,或者#Rectangle。除了内置的原语外,还可以指定.mesh文件。为了从FBX或glTF2资产生成.mesh文件,需要使用Balsam资产导入工具处理这些资产。下面是添加蓝色球体和红色扁平圆柱的代码:

 Model {
     position: Qt.vector3d(0, -200, 0)
     source: "#Cylinder"
     scale: Qt.vector3d(2, 0.2, 1)
     materials: [ DefaultMaterial {
             diffuseColor: "red"
         }
     ]
 }

 Model {
     position: Qt.vector3d(0, 150, 0)
     source: "#Sphere"

     materials: [ DefaultMaterial {
             diffuseColor: "blue"
         }
     ]

     SequentialAnimation on y {
         loops: Animation.Infinite
         NumberAnimation {
             duration: 3000
             to: -150
             from: 150
             easing.type:Easing.InQuad
         }
         NumberAnimation {
             duration: 3000
             to: 150
             from: -150
             easing.type:Easing.OutQuad
         }
     }
 }

相机

然后定义一个摄像机,它指定如何将3D场景的内容投影到2D表面上。在这里使用了透视图相机,它为我们提供了一个透视图投影。正投影也可能通过正投影相机类型。相机的默认方向是向前矢量沿负Z轴,向上矢量沿正Y轴。这里将相机在Z轴上移动回300。此外,它在Y轴上移动了一点,并在X轴上稍微旋转,使其看起来稍微向下。

 PerspectiveCamera {
     position: Qt.vector3d(0, 200, 300)
     eulerRotation.x: -30
 }

灯光

最后设置一个灯光进行照射,3D模型反射这些灯光后才能被肉眼所看见。

 DirectionalLight {
     eulerRotation.x: -30
     eulerRotation.y: -70
 }