En esta página

Skinning de vértices

Introducción

Qt Quick 3D admite el desvelado de vértices para la animación esquelética de geometrías de malla.

Consulte el ejemplo de skinning simple para ver una demostración práctica de la animación esquelética.

En la mayoría de los casos, los desarrolladores de aplicaciones no utilizarán la API de skinning manualmente. El flujo de trabajo normal consiste en utilizar una herramienta externa de creación de contenidos para definir el esqueleto y la piel (lo que a veces también se denomina rigging) y, a continuación, utilizar la herramienta de importación de activos Balsam para convertir el activo al formato nativo de Qt Quick 3D.

Definición de un esqueleto

La base de la animación esquelética es Skeleton. Se trata de una representación abstracta de cómo puede moverse el modelo, inspirada en el funcionamiento de un esqueleto físico de vertebrados. Los "huesos" del esqueleto están representados por una jerarquía de nodos Joint. Por supuesto, éstos no tienen por qué representar huesos reales.

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

    }
}

Conexión de un esqueleto a un modelo

Para aplicar un esqueleto a un modelo, establezca la propiedad skeleton del modelo:

Model {
    skeleton: qmlskeleton
    ...

Para que el esqueleto tenga efecto, la propiedad geometry del modelo debe incluir información sobre la piel. Esto se hace incluyendo vertex attributes con JointSemantic y WeightSemantic en el búfer de vértices.

El atributo JointSemantic determina qué articulaciones del esqueleto pueden influir en un vértice determinado. Para ello se utilizan los valores de índice especificados en Joint.index. Dado que este atributo contiene 4 índices, un máximo de 4 articulaciones pueden influir en un vértice.

El atributo WeightSemantic describe la fuerza de la influencia de esas articulaciones. Contiene cuatro valores de coma flotante, cada valor determina el peso dado a la articulación con el índice en la posición correspondiente en el atributo JointSemantic.

Por ejemplo, dado el esqueleto anterior, si un vértice tiene estos atributos

JointSemantic atributoWeightSemantic atributo
QVector4D(2, 0, 0, 0)QVector4D(1.0, 0.0, 0.0, 0.0)

ese vértice estará influenciado al 100% por la articulación2, y se moverá exactamente tanto como esa articulación. Los tres últimos índices del atributo JointSemantic se ignoran ya que los pesos correspondientes son 0.0.

Como otro ejemplo, con estos atributos

JointSemantic atributoWeightSemantic atributo
QVector4D(1, 2, 0, 0)QVector4D(0.5, 0.25, 0.0, 0.0)

el vértice se moverá el 50% del movimiento de la articulación1 más el 25% del movimiento de la articulación2.

Además, dado que el esqueleto es una representación abstracta, el modelo necesita especificar información de geometría para las articulaciones. Por razones de rendimiento, esto no se hace especificando la información directamente. En su lugar, Model.inverseBindPoses contiene la inversa de la matriz de transformación necesaria para mover cada articulación a su posición inicial.

Animación del esqueleto

La transformación de una articulación en un esqueleto moverá todos los vértices conectados a esa articulación. Dado que Joint hereda de Node, un esqueleto puede animarse simplemente utilizando QML animations estándar.

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

Aunque es posible crear animaciones complejas anidando SequentialAnimation, ParallelAnimation y NumberAnimation, generalmente es más conveniente utilizar animaciones de línea de tiempo para animar modelos con piel.

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