Auf dieser Seite

Qt Quick 3D - Beispiel für Ebenen

Veranschaulicht die Verwendung von Ebenen in „ QtQuick3D “.

Drei übereinanderliegende Ebenen mit dem Qt-Logo in Rot, Grün und Blau, mit Kontrollkästchen zum Ein- und Ausschalten der Ebenen

In diesem Beispiel werden die verschiedenfarbigen Logo-Modelle in unterschiedlichen Ebenen platziert. Über das Einstellungsfenster können Benutzer die Sichtbarkeit der einzelnen Ebenen durch Aktivieren bzw. Deaktivieren der Kontrollkästchen steuern.

Vorbereitung der Szenenebenen

Ebenen

Der Einfachheit halber weisen wir dem Enum-Typ von „ Layer “ einen Alias zu, der die Identifizierung erleichtert.

readonly property int redModels: ContentLayer.Layer1
readonly property int greenModels: ContentLayer.Layer2
readonly property int blueModels: ContentLayer.Layer3
Kamera

Da wir die Kameraansicht anhand der Ebenen filtern möchten, müssen wir festlegen, welche Ebenen die Kamera rendern soll. Dazu setzen wir die Eigenschaft „ layers “ der Kamera auf eine oder mehrere Ebenen. Die Kamera rendert dann nur die Objekte, die sich in den angegebenen „ layers “ befinden. Standardmäßig rendert die Kamera Knoten aus allen „ layers “.

Um die aktiven Ebenen auswählen zu können, erstellen wir eine Eigenschaft „ cameraFilter “ und binden sie an die Eigenschaft „ layers “ der Kamera.

property int cameraFilter: ContentLayer.LayerAll

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

Wenn die Kontrollkästchen im Einstellungsfenster aktiviert oder deaktiviert werden, wird die Eigenschaft „ cameraFilter “ aktualisiert, um die jeweiligen Ebenen einzuschließen oder auszuschließen. Auf diese Weise rendert die Kamera nur die Objekte, die sich in den durch „ cameraFilter “ angegebenen Ebenen befinden.

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

Die drei unterschiedlich farbigen Modelle müssen nun den jeweiligen Ebenen zugewiesen werden. Wie bei der Kamera können wir die Eigenschaft „ layers “ des Modells verwenden, um es einer Ebene zuzuweisen. Das rote Logo-Modell wird der Ebene „ redLayer “ zugewiesen, das grüne der Ebene „ greenLayer “ und das blaue der Ebene „ 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)
            }
        }
    }
}

Nachdem die Ebenen eingerichtet sind, rendert die Kamera nun nur noch die Modelle, die sich in den durch „ cameraFilter “ angegebenen Ebenen befinden. Der Benutzer kann die Sichtbarkeit der einzelnen Ebenen ein- oder ausschalten, indem er die Kontrollkästchen im Einstellungsbereich aktiviert oder deaktiviert.

Beispielprojekt @ 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.