Découpage des sommets
Introduction
Qt Quick 3D prend en charge l'habillage des sommets pour l'animation squelettique des géométries de maillage.
Voir l'exemple d'habillage simple pour une démonstration pratique de l'animation squelettique.
Dans la plupart des cas, les développeurs d'applications n'utiliseront pas l'API d'habillage manuellement. Le flux de travail normal consiste à utiliser un outil de création de contenu externe pour définir le squelette et la peau (ce qui est parfois appelé rigging), puis à utiliser l'outil d'importation d'actifs Balsam pour convertir l'actif dans le format natif de Qt Quick 3D.
Définition d'un squelette
La base de l'animation du squelette est le Skeleton. Il s'agit d'une représentation abstraite de la manière dont le modèle peut se déplacer, inspirée du fonctionnement du squelette physique des vertébrés. Les "os" du squelette sont représentés par une hiérarchie de nœuds Joint. Bien entendu, ces nœuds ne doivent pas nécessairement représenter des os réels.
Skeleton { id: qmlskeleton Joint { id: joint0 index: 0 skeletonRoot: qmlskeleton Joint { id: joint1 index: 1 skeletonRoot: qmlskeleton } Joint { id: joint2 index: 2 skeletonRoot: qmlskeleton } } }
Connecter un squelette à un modèle
Pour appliquer un squelette à un modèle, définissez la propriété skeleton du modèle :
Model {
skeleton: qmlskeleton
...Pour que le squelette ait un effet, le site geometry du modèle doit contenir des informations sur la peau. Pour ce faire, il faut inclure vertex attributes avec JointSemantic et WeightSemantic dans la mémoire tampon des vertex.
L'attribut JointSemantic détermine quelles articulations du squelette peuvent influencer un sommet donné. Il utilise les valeurs d'index spécifiées par Joint.index. Étant donné que cet attribut contient 4 index, 4 articulations au maximum peuvent influencer un sommet.
L'attribut WeightSemantic décrit la force de l'influence de ces articulations. Il contient quatre valeurs à virgule flottante, chaque valeur déterminant le poids accordé à l'articulation dont l'index se trouve à la position correspondante dans l'attribut JointSemantic.
Par exemple, dans le squelette ci-dessus, si un sommet possède ces attributs :
JointSemantic attribut | WeightSemantic attribut |
|---|---|
QVector4D(2, 0, 0, 0) | QVector4D(1.0, 0.0, 0.0, 0.0) |
ce sommet sera influencé à 100 % par l'articulation 2, et il se déplacera exactement autant que cette articulation. Les trois derniers indices de l'attribut JointSemantic sont ignorés puisque les poids correspondants sont 0.0.
Autre exemple, avec les attributs suivants
JointSemantic attribut | WeightSemantic attribut |
|---|---|
QVector4D(1, 2, 0, 0) | QVector4D(0.5, 0.25, 0.0, 0.0) |
le sommet sera déplacé de 50 % du mouvement de l'articulation 1 plus 25 % du mouvement de l'articulation 2.
En outre, le squelette étant une représentation abstraite, le modèle doit spécifier des informations géométriques pour les articulations. Pour des raisons de performance, ces informations ne sont pas spécifiées directement. Au lieu de cela, Model.inverseBindPoses contient l'inverse de la matrice de transformation nécessaire pour déplacer chaque articulation vers sa position initiale.
Animer le squelette
La transformation d'une articulation dans un squelette déplacera tous les sommets connectés à cette articulation. Étant donné que Joint hérite de Node, un squelette peut être animé en utilisant simplement la norme QML animations.
NumberAnimation { target: joint1 property: "eulerRotation.z" duration: 5000 from: -90 to: 90 running: true }
Bien qu'il soit possible de créer des animations complexes en imbriquant SequentialAnimation, ParallelAnimation et NumberAnimation, il est généralement plus pratique d'utiliser des animations temporelles pour animer des modèles en peau.
© 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.