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

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

相关推荐
大阳1231 分钟前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
YA3339 分钟前
java基础(九)sql基础及索引
java·开发语言·sql
奇树谦1 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt
weixin_307779131 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
froginwe112 小时前
HTML 框架:构建网页布局的基石
开发语言
Yn3122 小时前
在 Python 中使用 json 模块的完整指南
开发语言·python·json
binqian3 小时前
【异步】js中异步的实现方式 async await /Promise / Generator
开发语言·前端·javascript
林开落L3 小时前
库制作与原理(下)
linux·开发语言·centos·库制作与原理
fengfuyao9853 小时前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab
CHANG_THE_WORLD4 小时前
# C++ 中的 `string_view` 和 `span`:现代安全视图指南
开发语言·c++