Sur cette page

Qt Quick 3D - Exemple de calques

Illustre l'utilisation des calques dans QtQuick3D.

Trois calques superposés représentant le logo Qt en rouge, vert et bleu, avec des cases à cocher permettant d'activer ou de désactiver chaque calque

Dans cet exemple, les modèles de logo de différentes couleurs sont placés dans des calques distincts. À partir du panneau des paramètres, les utilisateurs peuvent contrôler la visibilité de chaque calque en cochant ou décochant les cases correspondantes.

Préparation des calques de la scène

Calques

Pour plus de commodité, nous attribuons aux types d’énumération d’ Layer un alias permettant de les identifier plus facilement.

readonly property int redModels: ContentLayer.Layer1
readonly property int greenModels: ContentLayer.Layer2
readonly property int blueModels: ContentLayer.Layer3
Caméra

Comme nous souhaitons filtrer la vue de la caméra en fonction des calques, nous devons définir les calques que la caméra doit afficher. Pour ce faire, nous définissons la propriété « layers » de la caméra sur un ou plusieurs calques. La caméra n’affichera alors que les objets se trouvant dans l’ layers e spécifiée. Par défaut, la caméra affiche les nœuds de tous les layers.

Pour pouvoir sélectionner les couches actives, nous créons une propriété « cameraFilter » et la lions à la propriété « layers » de la caméra.

property int cameraFilter: ContentLayer.LayerAll

camera: PerspectiveCamera {
    layers: v3d.cameraFilter
    position: Qt.vector3d(0, 400, 500)
    eulerRotation.x: -30
    clipFar: 2000
}

Lorsque les cases à cocher du panneau de paramètres sont activées ou désactivées, la propriété « cameraFilter » est mise à jour pour inclure ou exclure les calques correspondants. De cette manière, la caméra ne rendra que les objets se trouvant dans les calques spécifiés par la propriété « cameraFilter ».

CheckBox {
    id: checkBoxRedLayer
    text: qsTr("Red Layer")
    checked: true
    onCheckedChanged: {
        v3d.cameraFilter = checked ? v3d.cameraFilter | v3d.redModels : v3d.cameraFilter & ~v3d.redModels;
    }
}
Modèles

Les trois modèles de couleurs différentes doivent maintenant être affectés aux calques correspondants. Comme pour la caméra, nous pouvons utiliser la propriété ` layers ` du modèle pour l’affecter à un calque. Le modèle du logo rouge est affecté au calque ` redLayer`, le vert au calque ` greenLayer` et le bleu au calque ` blueLayer`.

Node {
    position: Qt.vector3d(0, 200, 0)
    Model {
        source: "qtlogo.mesh"
        layers: v3d.redModels
        scale: Qt.vector3d(5000, 5000, 5000)
        materials:[ PrincipledMaterial {
            baseColor: "red"
            roughness: 0.5
        } ]

        NumberAnimation on eulerRotation.y {
            from: 0
            to: 360
            duration: 15000
            loops: Animation.Infinite
        }
    }

    Model {
        position: Qt.vector3d(0, -50, 0)
        source: "#Cylinder"
        materials:[ PrincipledMaterial {
            baseColor: "red"
            roughness: 0.5
        } ]
    }

    ParticleSystem3D {
        visible: particlesCheckbox.checked
        running: particlesCheckbox.checked
        layers: v3d.redModels
        SpriteParticle3D {
            id: redParticle
            color: "red"
            maxAmount: 200
            particleScale: 8
            fadeInDuration: 500
            fadeOutDuration: 500
        }
        ParticleEmitter3D {
            particle: redParticle
            position: Qt.vector3d(0, -50, 0)
            emitRate: 40
            lifeSpan: 2000
            velocity: VectorDirection3D {
                direction: Qt.vector3d(0, 120, 0)
                directionVariation: Qt.vector3d(40, 40, 40)
            }
        }
    }
}

Node {
    position: Qt.vector3d(0, 100, 0)
    Model {
        source: "qtlogo.mesh"
        layers: v3d.greenModels
        scale: Qt.vector3d(5000, 5000, 5000)
        materials:[ PrincipledMaterial {
            baseColor: "green"
            roughness: 0.5
        } ]

        NumberAnimation on eulerRotation.y {
            from: 0
            to: 360
            duration: 20000
            loops: Animation.Infinite
        }
    }
    Model {
        position: Qt.vector3d(0, -50, 0)
        source: "#Cylinder"
        materials:[ PrincipledMaterial {
            baseColor: "green"
            roughness: 0.5
        } ]
    }

    ParticleSystem3D {
        visible: particlesCheckbox.checked
        running: particlesCheckbox.checked
        layers: v3d.greenModels
        SpriteParticle3D {
            id: greenParticle
            color: "green"
            maxAmount: 200
            particleScale: 8
            fadeInDuration: 500
            fadeOutDuration: 500
        }
        ParticleEmitter3D {
            particle: greenParticle
            position: Qt.vector3d(0, -50, 0)
            emitRate: 40
            lifeSpan: 2000
            velocity: VectorDirection3D {
                direction: Qt.vector3d(0, 120, 0)
                directionVariation: Qt.vector3d(40, 40, 40)
            }
        }
    }
}
Node {
    Model {
        source: "qtlogo.mesh"
        layers: v3d.blueModels
        scale: Qt.vector3d(5000, 5000, 5000)
        materials:[ PrincipledMaterial {
            baseColor: "blue"
            roughness: 0.5
        } ]

        NumberAnimation on eulerRotation.y {
            from: 0
            to: 360
            duration: 12500
            loops: Animation.Infinite
        }
    }
    Model {
        position: Qt.vector3d(0, -50, 0)
        source: "#Cylinder"
        materials:[ PrincipledMaterial {
            baseColor: "blue"
            roughness: 0.5
        } ]
    }

    ParticleSystem3D {
        visible: particlesCheckbox.checked
        running: particlesCheckbox.checked
        layers: v3d.blueModels
        SpriteParticle3D {
            id: blueParticle
            color: "blue"
            maxAmount: 200
            particleScale: 8
            fadeInDuration: 500
            fadeOutDuration: 500
        }
        ParticleEmitter3D {
            particle: blueParticle
            position: Qt.vector3d(0, -50, 0)
            emitRate: 40
            lifeSpan: 2000
            velocity: VectorDirection3D {
                direction: Qt.vector3d(0, 120, 0)
                directionVariation: Qt.vector3d(40, 40, 40)
            }
        }
    }
}

Une fois les calques configurés, la caméra ne rendra désormais que les modèles qui se trouvent dans les calques spécifiés par la propriété ` cameraFilter`. L'utilisateur peut activer ou désactiver la visibilité de chaque calque en cochant ou décochant les cases du panneau des paramètres.

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.