QT Quick 3D 渲染之场景构建(一)

main.qml
cpp 复制代码
import QtQuick
import QtQuick3D

import QtQuick3D.AssetUtils
import QtQuick3D.Helpers
import QtQuick3D.Particles3D
import QtQuick3D.Xr

import QtQuick.Controls

// qt 6.8

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("3D scene")

    // predefine camera
    Node {
        id: standAloneScene

        Node {
            PerspectiveCamera {
                id: cameraPerspectiveOne
                z: 600
            }

            PropertyAnimation on eulerRotation.x {
                loops: Animation.Infinite
                duration: 5000
                to: -360
                from: 0
            }
        }

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

        OrthographicCamera {
            id: cameraOrthographicLeft
            x: -600
            eulerRotation.y: -90
        }
    }

    Rectangle {
        id: topLeft
        anchors.top: parent.top
        anchors.left: parent.left
        width: parent.width * 0.5
        height: parent.height * 0.5
        color: "#848895"
        border.color: "black"

        View3D {
            anchors.fill: parent
            camera: activeCamera    // 使用相机
            PerspectiveCamera {     // 定义透视投影3D->2D相机
                id: activeCamera
                z: 400
            }

            DirectionalLight {  // 光源
                color: "white"
                eulerRotation.x: -30    // 欧拉角度
                eulerRotation.y: -70
            }

            Model {
                x: -100
                source: "#Cube"  // 内置Mesh
                materials: PrincipledMaterial { // 材质着色
                    baseColor: "red"
                }
            }

            Model {
                x: 100
                source: "#Sphere"   // 内置Mesh
                materials: PrincipledMaterial { // 材质着色
                    baseColor: "green"
                }
            }

            environment: SceneEnvironment { // 背景色
                clearColor: "skyblue"
                backgroundMode: SceneEnvironment.Color
            }

            WasdController {  // wasd键控制相机
                controlledObject: activeCamera
            }
        }

        Label {
            text: "Front"
            anchors.top: parent.top
            anchors.left: parent.left
            anchors.margins: 10
            color: "#222840"
            font.pointSize: 14
        }
    }

    Rectangle {
        id: topRight
        anchors.top: parent.top
        anchors.right: parent.right
        width: parent.width * 0.5
        height: parent.height * 0.5
        color: "#848895"
        border.color: "black"

        View3D {
            id: topRightView
            anchors.fill: parent
            importScene: standAloneScene
            camera: cameraOrthographicLeft

            DirectionalLight {
                color: "white"
            }

            PointLight {
                y: 200
                color: "#d9c62b"
                brightness: 5
                castsShadow: true  // 阴影投射
                shadowFactor: 75

                Model {     // 寻找光源位置,白色小立方体
                    source: "#Cube"
                    scale: Qt.vector3d(0.01, 0.01, 0.01)
                    materials: PrincipledMaterial {
                        lighting: PrincipledMaterial.NoLighting
                    }
                }
            }

            Model {
                position: Qt.vector3d(0, -200, 0)
                source: "#Cylinder"
                scale: Qt.vector3d(2, 0.2, 1)
                materials: [ PrincipledMaterial { // 多材质着色
                        baseColor: "red"
                    }
                ]
            }

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

                materials: [ PrincipledMaterial {
                        baseColor: "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
                    }
                }
            }

            WaterBottle {
                id: modelInstance
                scale: Qt.vector3d(10, 10, 10)
                NumberAnimation on eulerRotation.y {
                    from: 0
                    to: 360
                    duration: 3000
                    loops: Animation.Infinite
                }
            }

            environment: SceneEnvironment { // 天空盒背景
                backgroundMode: SceneEnvironment.SkyBox
                lightProbe: Texture {
                    textureData: ProceduralSkyTextureData {
                    }
                }
            }
        }

        Label {
            text: "Front"
            anchors.top: parent.top
            anchors.right: parent.right
            anchors.margins: 10
            color: "#222840"
            font.pointSize: 14
        }

        RoundButton {
            text: "Camera 1"
            anchors.centerIn: parent
            anchors.bottom: parent.top
            anchors.margins: 10
            highlighted: topRightView.camera == cameraPerspectiveOne
            implicitWidth: 100
            onClicked: {
                    topRightView.camera = cameraPerspectiveOne
                }
        }
    }

    Button {
        anchors.right: parent.right
        text: "debug"
        onClicked: debugView.visible = !debugView.visible
        DebugView {  // render statics data
            id: debugView
            source: topRightView
            anchors.top: parent.bottom
            anchors.right: parent.right
        }
    }
}
效果展示

创作不易,小小的支持一下吧!

相关推荐
葡萄成熟时 !4 小时前
泛型知识笔记
开发语言·笔记·python
新时代牛马5 小时前
SPL-TPL 链式启动:spl.c 与CONFIG_TPL 三阶段加载
c语言·开发语言
布莱克6055 小时前
链表详解:定义、作用、应用场景及与数组的区别(C/C++ 实战)
c语言·开发语言·c++·链表
2601_966949655 小时前
实时行情中的成交量 Volume 到底是什么?包含盘中撤单量吗?从交易数据语义到 QuantDash 实战解析
开发语言·人工智能·python·量化·quantdash·量化数据源
开开心心就好5 小时前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
zx_741484816 小时前
【Python入门】爬虫实战:Requests + XPath 从基础到实战
开发语言·爬虫·python
吴声子夜歌6 小时前
Java——开发中通用的方法和准则(二)
java·开发语言·php
江屿风6 小时前
C++OJ题经验总结(竞赛)5
开发语言·c++
溪语流沙6 小时前
【Python项目实战】虚拟环境与依赖管理:venv / pip / requirements.txt实操
开发语言·python·pip
神威难绷泪6 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程