Auf dieser Seite

Qt Quick 3D - Beispiel „Lichter“

Veranschaulicht die Verwendung verschiedener Lichttypen.

Qt-Logo-Kachel mit farbigen Lichtern und Schatten zur Veranschaulichung verschiedener Beleuchtungsarten

Dieses Beispiel zeigt die Verwendung von drei verschiedenen Lichttypen in einer Anwendung.

Einrichten der Szenenlichter

Richtungslicht

Das gerichtete Licht strahlt in eine Richtung von einer nicht identifizierbaren Quelle aus, die sich in unendlicher Entfernung befindet. Dies ähnelt der Funktionsweise des Sonnenlichts im realen Leben. Ein gerichtetes Licht hat eine unendliche Reichweite und nimmt nicht ab.

Wir richten das gerichtete Licht so ein, dass es rotes Licht ausstrahlt, und animieren seine Drehung um die x-Achse.

DirectionalLight {
    id: light1
    color: Qt.rgba(1.0, 0.1, 0.1, 1.0)
    ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    position: Qt.vector3d(0, 200, 0)
    rotation: Quaternion.fromEulerAngles(-135, -90, 0)
    shadowMapQuality: Light.ShadowMapQualityVeryHigh
    pcfFactor: 1
    visible: directionalLightCheckBox.checked
    castsShadow: checkBoxShadows.checked
    brightness: directionalLightSlider.value
    SequentialAnimation on rotation {
        loops: Animation.Infinite
        QuaternionAnimation {
            to: Quaternion.fromEulerAngles(-45, -90, 0)
            duration: 2000
            easing.type: Easing.InOutQuad
        }
        QuaternionAnimation {
            to: Quaternion.fromEulerAngles(-135, -90, 0)
            duration: 2000
            easing.type: Easing.InOutQuad
        }
    }
}
Punktlicht

Das Punktlicht lässt sich als Kugel beschreiben, die von ihrem Zentrum aus in alle Richtungen gleich starkes Licht ausstrahlt. Dies ähnelt der Art und Weise, wie eine Glühbirne Licht ausstrahlt.

Wir richten das Punktlicht so ein, dass es grünes Licht ausstrahlt, und animieren seine Position entlang der x-Koordinate.

PointLight {
    id: light2
    color: Qt.rgba(0.1, 1.0, 0.1, 1.0)
    ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    position: Qt.vector3d(0, 300, 0)
    shadowMapFar: 2000
    shadowMapQuality: Light.ShadowMapQualityHigh
    visible: pointLightCheckBox.checked
    castsShadow: checkBoxShadows.checked
    brightness: pointLightSlider.value
    SequentialAnimation on x {
        loops: Animation.Infinite
        NumberAnimation {
            to: 400
            duration: 2000
            easing.type: Easing.InOutQuad
        }
        NumberAnimation {
            to: 0
            duration: 2000
            easing.type: Easing.InOutQuad
        }
    }
}
Spotlicht

Der Strahler ähnelt der Punktlichtquelle, strahlt jedoch Licht nicht in alle Richtungen, sondern kegelförmig in eine Richtung aus. Abgesehen vom Kegelwinkel weist ein Strahler dieselben Merkmale und Eigenschaften wie die Punktlichtquelle auf.

Wir richten ein Spotlicht so ein, dass es eine warme Farbe ausstrahlt, und animieren seine Drehung entlang der y-Koordinate.

SpotLight {
    id: light4
    color: Qt.rgba(1.0, 0.9, 0.7, 1.0)
    ambientColor: Qt.rgba(0.0, 0.0, 0.0, 0.0)
    position: Qt.vector3d(0, 250, 0)
    eulerRotation.x: -45
    shadowMapFar: 2000
    shadowMapQuality: Light.ShadowMapQualityHigh
    visible: spotLightCheckBox.checked
    castsShadow: checkBoxShadows.checked
    brightness: spotLightSlider.value
    coneAngle: 110
    innerConeAngle: 70
    PropertyAnimation on eulerRotation.y {
        loops: Animation.Infinite
        from: 0
        to: -360
        duration: 10000
    }
}

Einrichten der Szenenmodelle

Zunächst fügen wir zwei Rechteckmodelle hinzu, die als Boden und Rückwand für unsere Szene dienen. Diese sind nützlich, um Licht- und Schatteneffekte zu erkennen.

Model {
    source: "#Rectangle"
    y: -200
    scale: Qt.vector3d(15, 15, 15)
    eulerRotation.x: -90
    materials: [
        PrincipledMaterial {
            baseColor: Qt.rgba(0.8, 0.6, 0.4, 1.0)
        }
    ]
}
Model {
    source: "#Rectangle"
    z: -400
    scale: Qt.vector3d(15, 15, 15)
    materials: [
         PrincipledMaterial {
            baseColor: Qt.rgba(0.8, 0.8, 0.9, 1.0)
        }
    ]
}

Anschließend fügen wir unser Hauptlogo-Modell hinzu, das um die y-Achse gedreht ist.

Model {
    id: logoDefault
    source: "qtlogo.mesh"
    scale: Qt.vector3d(5000, 5000, 5000)

    property variant material
    materials: [ material ]

    property bool animate: true
    NumberAnimation on eulerRotation.y {
        running: logoDefault.animate
        loops: Animation.Infinite
        duration: 5000
        from: 0
        to: -360
    }
}

Außerdem fügen wir kleine Würfelmodelle hinzu, um Position und Drehung der einzelnen Lichttypen zu veranschaulichen. Diese Würfel werden größer, wenn der Benutzer die entsprechenden Schieberegler betätigt.

Model {
    // Directional Light Marker
    property real size: directionalLightSlider.highlight ? 0.2 : 0.1
    source: "#Cube"
    position: light1.position
    rotation: light1.rotation
    scale: Qt.vector3d(size, size, size * 2)
    materials: [
        PrincipledMaterial {
            baseColor: light1.color
            lighting: PrincipledMaterial.NoLighting
        }
    ]
    castsShadows: false
    visible: directionalLightCheckBox.checked
}
Model {
    // Point Light Marker
    source: "#Sphere"
    position: light2.position
    rotation: light2.rotation
    property real size: pointLightSlider.highlight ? 0.2 : 0.1
    scale: Qt.vector3d(size, size, size)
    materials: [
        PrincipledMaterial {
            baseColor: light2.color
            lighting: PrincipledMaterial.NoLighting
        }
    ]
    castsShadows: false
    visible: pointLightCheckBox.checked
}
Node {
    // Spot Light Marker
    position: light4.position
    rotation: light4.rotation
    property real size: spotLightSlider.highlight ? 0.2 : 0.1
    scale: Qt.vector3d(size, size, size)
    Model {
        source: "#Cone"
        castsShadows: false
        eulerRotation.x: 90
        materials: PrincipledMaterial {
            baseColor: light4.color
            lighting: PrincipledMaterial.NoLighting
        }
    }
    visible: spotLightCheckBox.checked
}

Über das Einstellungsfeld kann der Benutzer dann Schatten aktivieren und die Sichtbarkeit sowie Helligkeit jeder Lichtquelle separat steuern.

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