Qt Quick 3D - Level of Detail Helper Example

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQuick
import QtQuick3D
import QtQuick3D.Helpers

Window {
    id: window
    width: 1280
    height: 720
    visible: true

    View3D {
        id: view
        anchors.fill: parent

        environment: SceneEnvironment {
            clearColor: "black"
            backgroundMode: SceneEnvironment.Color
            antialiasingMode: SceneEnvironment.MSAA
            antialiasingQuality: SceneEnvironment.High
        }

        PerspectiveCamera {
            id: camera
            position: Qt.vector3d(0, 10, 300)
            clipNear: 1.0
            NumberAnimation on z {
                from: 200
                to: -100
                duration: 40 * 1000
            }
        }

        DirectionalLight {
            eulerRotation.x: -30
            eulerRotation.y: -70
            ambientColor: Qt.rgba(0.5, 0.5, 0.5, 1.0)
        }

        RandomInstancing {
            id: randomInstancing
            instanceCount: 800

            position: InstanceRange {
                from: Qt.vector3d(-200, 0, -200)
                to: Qt.vector3d(200, 1, 200)
            }
            scale: InstanceRange {
                from: Qt.vector3d(10, 10, 10)
                to: Qt.vector3d(10, 10, 10)
            }
            rotation: InstanceRange {
                from: Qt.vector3d(0, 0, 0)
                to: Qt.vector3d(0, 0, 0)
            }
            color: InstanceRange {
                from: "grey"
                to: "white"
                proportional: true
            }

            randomSeed: 2021
        }

        PrincipledMaterial {
            id: marbleMaterial
            baseColorMap: Texture {
                source: "maps/baseColor.png"
                generateMipmaps: true
                mipFilter: Texture.Linear
            }
            opacityChannel: Material.A
            metalnessMap: Texture {
                source: "maps/occlusionRoughnessMetallic.png"
                generateMipmaps: true
                mipFilter: Texture.Linear
            }
            metalnessChannel: Material.B
            roughnessMap: Texture {
                source: "maps/occlusionRoughnessMetallic.png"
                generateMipmaps: true
                mipFilter: Texture.Linear
            }
            roughnessChannel: Material.G
            metalness: 1
            roughness: 1
            normalMap: Texture {
                source: "maps/normal.png"
                generateMipmaps: true
                mipFilter: Texture.Linear
            }
        }

        LodManager {
            camera: camera
            distances: [100, 140, 180]
            fadeDistance: 10

            Model {
                scale: Qt.vector3d(100, 100, 100);
                source: "meshes/marble_bust_01_LOD_0.mesh"
                materials: [ marbleMaterial ]
            }

            Model {
                scale: Qt.vector3d(100, 100, 100);
                source: "meshes/marble_bust_01_LOD_1.mesh"
                materials: [ marbleMaterial ]
            }

            Model {
                scale: Qt.vector3d(100, 100, 100);
                source: "meshes/marble_bust_01_LOD_2.mesh"
                materials: [ marbleMaterial ]
            }

            Model {
                scale: Qt.vector3d(100, 100, 100);
                source: "meshes/marble_bust_01_LOD_3.mesh"
                materials: [ marbleMaterial ]
            }
        }

        LodManager {
            camera: camera
            distances: [50, 100, 150]

            Model {
                instancing: randomInstancing
                source: "#Sphere"
                materials: [
                    PrincipledMaterial {
                        metalness: 0
                        roughness: 1
                        baseColor: "red"
                    }
                ]
                scale: Qt.vector3d(0.005, 0.005, 0.005)
            }

            Model {
                instancing: randomInstancing
                source: "#Cylinder"
                materials: [
                    PrincipledMaterial {
                        metalness: 0
                        roughness: 1
                        baseColor: "orange"
                    }
                ]
                scale: Qt.vector3d(0.005, 0.005, 0.005)
            }

            Model {
                instancing: randomInstancing
                source: "#Cube"
                materials: [
                    PrincipledMaterial {
                        metalness: 0
                        roughness: 1
                        baseColor: "yellow"
                    }
                ]
                scale: Qt.vector3d(0.005, 0.005, 0.005)
            }

            Model {
                instancing: randomInstancing
                source: "#Rectangle"
                materials: [
                    PrincipledMaterial {
                        metalness: 0
                        roughness: 1
                        baseColor: "green"
                    }
                ]
                scale: Qt.vector3d(0.005, 0.005, 0.005)
            }
        }
    }

    DebugView {
        source: view
    }
}