Qt Quick 3D模块初探

0.前言

Qt Quick 3D提供了用于基于Qt Quick创建3D内容或UI的高级API。提供了对现有Qt Quick场景图(scenegraph )的扩展,以及对该扩展场景图的渲染器。使用空间场景图(Spatial scenegraph)时,还可以将Qt Quick 2D内容与3D内容混合。从官方的描述来看,可以看成一个简化版的Qt3D模块。但要注意的是,开源版本下,Qt3D是LGPL授权,而Qt Quick 3D是GPL授权。

因为该模块是从Qt5.14开始提供预览版,Qt5.15正式加入的,所以资料相对较少,在Qt Creator中有几个简单的示例。

使用时,先导入模块(测试了两个Demo,发现pro文件不写QT+=quick3d也是能运行的):

import QtQuick3D 1.15

除了基本的Qt Quick 3D模块外,还提供了其他功能: 

import QtQuick3D.Materials 1.15
import QtQuick3D.Effects 1.15
import QtQuick3D.Helpers 1.15

本文代码链接:https://github.com/gongjianbo/HelloQtQuick3D

Qt Quick 3D概述:https://doc.qt.io/qt-5/qtquick3d-index.html

1.第一个窗口

要渲染一个3D场景,需要使用View3D对象,View3D为要渲染的3D内容提供2D表面。在3D场景中,使用Node对象树来描述我们的场景。下面的示例是一个空白的窗口,只有clearColor:

import QtQuick 2.15
import QtQuick3D 1.15

Item {
    id: control

    //渲染3D场景的视口
    //View3D为要渲染的3D内容提供2D表面。在将3D内容显示在Qt Quick场景中之前,必须先将其展平。
    //it must first be flattend.
    View3D {
        id: view
        anchors.fill: parent
        anchors.margins: 20

        //为了控制场景的呈现,有必要定义一个SceneEnvironment的环境属性。
        //SceneEnvironment定义了渲染场景的环境,该环境定义了如何全局渲染场景。
        environment: SceneEnvironment {
            clearColor: "darkGreen"
            backgroundMode: SceneEnvironment.Color
        }

        //要将3D场景投影到2D视口,必须从摄像机查看场景。
        //正交投影:OrthographicCamera
        //透视投影:PerspectiveCamera
        OrthographicCamera {
            position: Qt.vector3d(0, 0, 0)
        }
    }
    Text {
        anchors.centerIn: parent
        text: "First Window"
        color: "white"
    }
}

下面再来试试一些预定义的Model(Model也是继承自Node):

import QtQuick 2.15
import QtQuick3D 1.15

//渲染3D场景的视口
View3D {
    id: control

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

    //透视投影
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 300)
        //eulerRotation.x: -30
    }

    //光源
    DirectionalLight {
        eulerRotation.x: -100
        eulerRotation.y: -100
        eulerRotation.z: 500
    }

    //加载3D模型数据
    //为了使模型可渲染,它至少需要一个网格Mesh和一种材质Material
    //Qt Quick 3D本身内置了几个简单的模型
    //圆球
    Model {
        position: Qt.vector3d(0, 0, 0)
        source: "#Sphere"
        materials: [
            DefaultMaterial {
                diffuseColor: "blue"
            }
        ]
    }
    //矩形
    Model {
        position: Qt.vector3d(-100, -100, 0)
        source: "#Cube"
        scale: Qt.vector3d(2, 0.1, 1)
        eulerRotation: Qt.vector3d(0,0,-20)
        materials: [
            DefaultMaterial {
                diffuseColor: "red"
            }
        ]
    }
}

2.混合Qt Quick Item画三角

相对于Qt3D可以直接在QML中定义顶点,QtQuick3D好像没那么方便。我只看到一个叫Geometry的类型可以自定义几何形状,但是需要使用C ++实现并注册到QML。又或者Model的source使用自己生成的mesh文件,很明显这也不方便。索性我就放了一个QML的Shape画的三角:

import QtQuick 2.15
import QtQuick3D 1.15
import QtQuick.Shapes 1.15

//渲染3D场景的视口
View3D {
    id: control

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

    //透视投影
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 300)
        //eulerRotation.x: -30
    }

    //光源
    DirectionalLight {
        eulerRotation.x: -100
        eulerRotation.y: -100
        eulerRotation.z: 500
    }

    //自定义Geometry还得从Cpp注册,或者source加载自己的mesh文件
    //为了图方便,贴一个Quick2的Shape来展示三角
    Node {
        position: Qt.vector3d(0, 0, 0)
        Shape {
            id: shape
            width: 300
            height: 200
            ShapePath {
                strokeColor: "transparent"
                fillColor: "lightGreen"
                startX: shape.width/2; startY: 0
                PathLine { x: shape.width; y: shape.height }
                PathLine { x: 0; y: shape.height }
                PathLine { x: shape.width/2; y: 0 }
            }
        }
    }
}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值