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
        }
    }
}
效果展示

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

相关推荐
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题2 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说2 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号2 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_2 天前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty2 天前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再2 天前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame