顶点皮肤协同处理

简介

Qt Quick 3D 支持网格几何体的骨骼动画顶点皮肤协同处理。

请参阅简单皮肤协同处理示例,以了解骨骼动画的实际演示。

在大多数情况下,应用程序开发人员不会手动使用皮肤协同处理 API。正常的工作流程是使用外部内容创建工具定义骨骼和皮肤(这有时也称为装甲),然后使用Balsam 资产导入工具将资产转换为 Qt Quick 3D 的原生格式。

定义骨骼

骨骼动画的基础是骨骼。这是模型如何移动的抽象表示,其灵感来源于脊椎动物如何使用物理骨骼。骨骼的“骨头”由关节节点层次结构表示。当然,这些不必代表实际的骨头。

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

    }
}

将骨骼连接到模型

要将骨骼应用到模型上,请设置模型的skeleton属性

Model {
    skeleton: qmlskeleton
    ...

为了使骨骼产生效果,模型的geometry必须包含皮肤协同处理信息。这是通过在顶点缓冲区中包含具有JointSemanticWeightSemantic顶点属性来完成的。

JointSemantic属性确定骨骼中的哪些关节可以影响特定的顶点。它使用Joint.index指定的索引值。由于此属性包含 4 个索引,最大可以由 4 个关节影响一个顶点。

WeightSemantic属性描述了那些关节影响的强度。它含有四个浮点值,每个值都决定分配给对应于JointSemantic属性中相应位置的那个关节的权重。

例如,给定上面的骨骼,如果一个顶点有这些属性

JointSemantic属性WeightSemantic属性
QVector4D(2, 0, 0, 0)QVector4D(1.0, 0.0, 0.0, 0.0)

那个顶点将完全受joint2的影响,并且将恰好移动与该关节相同的距离。最后三个索引在JointSemantic属性中被忽略,因为相应的权重是0.0

另一个例子,具有以下属性

JointSemantic属性WeightSemantic属性
QVector4D(1, 2, 0, 0)QVector4D(0.5, 0.25, 0.0, 0.0)

该顶点将移动 50% 的joint1移动加上 25% 的joint2移动。

此外,由于骨骼是一种抽象表示,模型需要指定关节的几何信息。出于性能考虑,不是直接指定信息。相反,Model.inverseBindPoses 包含将每个关节移动到其初始位置的变换矩阵的

骨骼动画

在骨骼中变换一个关节将移动与此关节相连的所有顶点。由于关节继承自 Node,可以通过使用标准的 QML 动画 来简单地动画化骨骼。

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

虽然可以通过嵌套 SequentialAnimationParallelAnimationNumberAnimation 创建复杂的动画,但通常使用 时间线动画 来为骨骼模型动画化会更方便。

© 2024 Qt 公司有限公司。此处包含的文档贡献的版权归其各自所有者。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款授予许可。Qt 和相关标志是芬兰及/或全球其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。