Auf dieser Seite

Qt Quick 3D - Beispiel für Morphing

Veranschaulicht, wie Morphing-Animationen in „ Qt Quick 3D “ gesteuert werden.

3D-Kopfmodell mit Schiebereglern zum Verformen von Mund, Ohren und „Cubify“

Dieses Beispiel zeigt, wie man Morphing-Animationen an einem Modell steuert, das aus einem externen Tool importiert wurde.

Erstellen eines Netzes

Das Mesh für das Modell wurde mit dem 3D-Modellierungsprogramm Blender erstellt. Zusätzlich zur Grundform enthält das Mesh drei Morph-Ziele (in Blender als „Shape Keys“ bezeichnet).

Blender-Benutzeroberfläche mit Affenkopf-Modell und Shape-Key-Steuerelementen

Es wurde aus Blender als glTF-Datei exportiert und mit Balsam importiert.

Steuerung der Morph-Ziele

Normalerweise wird das Morphing über eine Timeline-Animation oder eine Eigenschaftsanimation gesteuert. In diesem Beispiel verwenden wir stattdessen Schieberegler, um frei mit der Kombination verschiedener Gewichte experimentieren zu können:

            Label { text: "Mouth:"; }
            RealSlider {
                id: mouthSlider
                from: 0.0
                to: 1.0
            }
            Label { text: "Ears and eyebrows:" }
            RealSlider {
                id: earSlider
                from: 0.0
                to: 1.0
            }
            Label { text: "Cubify:" }
            RealSlider {
                id: cubeSlider
                from: 0.0
                to: 1.0
            }

(„RealSlider “ ist ein einfacher Schieberegler, der einen Gleitkommawert liefert. Er stammt aus dem Effekte-Beispiel.)

Wir definieren für jedes der Ziele im Mesh einen „ MorphTarget “. Morph-Ziele sind die Objekte, an die wir die Steuerung binden, um das Morphing zu steuern. In der Regel werden sie animiert, aber in diesem Beispiel binden wir sie an die Schiebereglerwerte:

        MorphTarget {
            id: morphtarget0
            weight: mouthSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }
        MorphTarget {
            id: morphtarget1
            weight: earSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }
        MorphTarget {
            id: morphtarget2
            weight: cubeSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }

Abschließend erstellen wir ein Modell und binden die Morph-Ziele an die Ziele im Mesh:

        Model {
            source: "suzanne.mesh"
            morphTargets: [
                morphtarget0,
                morphtarget1,
                morphtarget2
            ]
            materials: PrincipledMaterial {
                baseColor: "#41cd52"
                roughness: 0.1
            }
            SequentialAnimation on eulerRotation.y {
                NumberAnimation { from: -45; to: 45; duration: 10000 }
                NumberAnimation { from: 45; to: -45; duration: 10000 }
                loops: Animation.Infinite
            }
        }

Beachte, dass die Ziele anhand ihrer Position in der Liste zugeordnet werden: Die Namen spielen keine Rolle.

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.