Vertex Skinning
Einführung
Qt Quick 3D unterstützt Vertex Skinning für die skelettartige Animation von Mesh-Geometrien.
Eine praktische Demonstration der Skelettanimation finden Sie im Simple Skinning Example.
In den meisten Fällen werden Anwendungsentwickler die Skinning-API nicht manuell verwenden. Der normale Arbeitsablauf besteht darin, ein externes Tool zur Erstellung von Inhalten zu verwenden, um das Skelett und den Skin zu definieren (dies wird manchmal auch als Rigging bezeichnet), und dann das Balsam Asset Import Tool zu verwenden, um das Asset in das native Format von Qt Quick 3D zu konvertieren.
Definieren eines Skeletts
Die Grundlage der Skelettanimation ist das Skeleton. Dies ist eine abstrakte Darstellung der Bewegungsmöglichkeiten des Modells, die sich an der Funktionsweise eines physischen Skeletts bei Wirbeltieren orientiert. 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 } } }
Verbinden eines Skeletts mit einem Modell
Um ein Skelett auf ein Modell anzuwenden, setzen Sie die Eigenschaft skeleton des Modells:
Model { skeleton: qmlskeleton ...
Damit das Skelett seine Wirkung entfalten kann, muss die geometry des Modells Hautinformationen enthalten. Dies geschieht, indem vertex attributes mit JointSemantic
und WeightSemantic
in den Vertex-Puffer aufgenommen wird.
Das Attribut JointSemantic
bestimmt, welche der Gelenke im Skelett einen bestimmten Vertex beeinflussen können. Dazu werden die von Joint.index angegebenen Indexwerte verwendet. Da dieses Attribut 4 Indizes enthält, können maximal 4 Gelenke einen Vertex beeinflussen.
Das Attribut WeightSemantic
beschreibt die Stärke des Einflusses dieser Gelenke. Es enthält vier Fließkommawerte, wobei jeder Wert das Gewicht bestimmt, das dem Gelenk mit dem Index an der entsprechenden Position im Attribut JointSemantic
zugewiesen wird.
Wenn ein Scheitelpunkt zum Beispiel diese Attribute hat, ist das obige Skelett gegeben:
JointSemantic Attribut | WeightSemantic Attribut |
---|---|
QVector4D(2, 0, 0, 0) | QVector4D(1.0, 0.0, 0.0, 0.0) |
wird dieser Scheitelpunkt zu 100% von Gelenk2 beeinflusst und bewegt sich genau so viel wie dieses Gelenk. Die letzten drei Indizes im Attribut JointSemantic
werden ignoriert, da die entsprechenden Gewichte 0.0
sind.
Ein weiteres Beispiel mit diesen Attributen:
JointSemantic Attribut | WeightSemantic Attribut |
---|---|
QVector4D(1, 2, 0, 0) | QVector4D(0.5, 0.25, 0.0, 0.0) |
wird der Scheitelpunkt um 50% der Bewegung von Gelenk1 plus 25% der Bewegung von Gelenk2 bewegt.
Da das Skelett eine abstrakte Darstellung ist, muss das Modell außerdem Geometrieinformationen für die Gelenke angeben. Aus Leistungsgründen wird dies nicht durch direkte Angabe der Informationen erreicht. Stattdessen enthält Model.inverseBindPoses die Umkehrung der Transformationsmatrix, die erforderlich ist, um jedes Gelenk in seine Ausgangsposition zu bewegen.
Animieren des Skeletts
Die Transformation eines Gelenks in einem Skelett verschiebt alle mit diesem Gelenk verbundenen Eckpunkte. Da Joint von Node erbt, kann ein Skelett einfach mit dem Standard QML animations animiert werden.
NumberAnimation { target: joint1 property: "eulerRotation.z" duration: 5000 from: -90 to: 90 running: true }
Obwohl es möglich ist, komplexe Animationen durch Verschachtelung von SequentialAnimation, ParallelAnimation und NumberAnimation zu erstellen, ist es im Allgemeinen bequemer, Zeitleisten-Animationen für die Animation von gehäuteten Modellen zu verwenden.
© 2025 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.