Auf dieser Seite

Vertex-Skinning

Einführung

Qt Quick 3D unterstützt Vertex-Skinning für Skelettanimationen von Mesh-Geometrien.

Ein praktisches Beispiel für Skelettanimationen finden Sie im Beispiel „Einfaches Skinning “.

In den meisten Fällen werden Anwendungsentwickler die Skinning-API nicht manuell nutzen. Der übliche Arbeitsablauf besteht darin, ein externes Tool zur Inhaltserstellung zu verwenden, um das Skelett und die Haut zu definieren (dies wird manchmal auch als „Rigging“ bezeichnet), und anschließend das „Balsam Asset Import Tool“ zu nutzen, um das Asset in das native Format von „ Qt Quick 3D “ zu konvertieren.

Ein Skelett definieren

Die Grundlage der Skelettanimation ist das „ Skeleton “. Dabei handelt es sich um eine abstrakte Darstellung der Bewegungsmöglichkeiten des Modells, inspiriert von der Funktionsweise eines physischen Skeletts bei Wirbeltieren. Die „Knochen“ des Skeletts werden durch eine Hierarchie von „ Joint “-Knoten dargestellt. Diese müssen natürlich nicht unbedingt tatsächliche Knochen darstellen.

Skeleton {
    id: qmlskeleton
    Joint {
        id: joint0
        index: 0
        skeletonRoot: qmlskeleton
        Joint {
            id: joint1
            index: 1
            skeletonRoot: qmlskeleton
        }
        Joint {
            id: joint2
            index: 2
            skeletonRoot: qmlskeleton
        }

    }
}

Ein Skelett mit einem Modell verbinden

Um ein Skelett auf ein Modell anzuwenden, legen Sie die Eigenschaft „ skeleton “ des Modells fest:

Model {
    skeleton: qmlskeleton
    ...

Damit das Skelett wirksam wird, muss die „ geometry “-Eigenschaft des Modells Skinning-Informationen enthalten. Dies geschieht durch Einbindung von „ vertex attributes “ mit den Attributen „ JointSemantic “ und „ WeightSemantic “ in den Vertex-Puffer.

Das Attribut „ JointSemantic “ legt fest, welche Gelenke des Skeletts einen bestimmten Scheitelpunkt beeinflussen können. Dabei werden die durch „ Joint.index “ angegebenen Indexwerte verwendet. Da dieses Attribut 4 Indizes enthält, können maximal 4 Gelenke einen Scheitelpunkt beeinflussen.

Das Attribut „ WeightSemantic “ beschreibt die Stärke des Einflusses dieser Gelenke. Es enthält vier Gleitkommawerte, wobei jeder Wert die Gewichtung des Gelenks mit dem Index an der entsprechenden Position im Attribut „ JointSemantic “ festlegt.

Beispiel: Bei dem oben gezeigten Skelett hat ein Scheitelpunkt folgende Attribute:

JointSemantic AttributWeightSemantic attribute
QVector4D(2, 0, 0, 0)QVector4D(1.0, 0.0, 0.0, 0.0)

wird dieser Scheitelpunkt zu 100 % von Gelenk 2 beeinflusst und bewegt sich genau so weit wie dieses Gelenk. Die letzten drei Indizes im Attribut „ JointSemantic “ werden ignoriert, da die entsprechenden Gewichte „ 0.0 “ lauten.

Ein weiteres Beispiel mit folgenden Attributen:

JointSemantic AttributWeightSemantic Attribut
QVector4D(1, 2, 0, 0)QVector4D(0.5, 0.25, 0.0, 0.0)

wird der Scheitelpunkt um 50 % der Bewegung von Gelenk 1 plus 25 % der Bewegung von Gelenk 2 verschoben.

Da es sich bei dem Skelett zudem um eine abstrakte Darstellung handelt, muss das Modell Geometrieinformationen für die Gelenke angeben. Aus Leistungsgründen erfolgt dies nicht durch direkte Angabe der Informationen. Stattdessen enthält „ Model.inverseBindPoses “ die Inverse der Transformationsmatrix, die benötigt wird, um jedes Gelenk in seine Ausgangsposition zu verschieben.

Animation des Skeletts

Die Transformation eines Gelenks in einem Skelett verschiebt alle mit diesem Gelenk verbundenen Scheitelpunkte. Da `Joint` von ` Node` erbt, lässt sich ein Skelett einfach mithilfe von Standard- QML animations animieren.

NumberAnimation {
    target: joint1
    property: "eulerRotation.z"
    duration: 5000
    from: -90
    to: 90
    running: true
}

Zwar ist es möglich, komplexe Animationen durch Verschachtelung von ` SequentialAnimation`, ` ParallelAnimation ` und ` NumberAnimation` zu erstellen, doch ist es im Allgemeinen praktischer, Zeitachsenanimationen zur Animation von Skinned-Modellen zu verwenden.

© 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.