顶点皮肤协同处理
简介
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必须包含皮肤协同处理信息。这是通过在顶点缓冲区中包含具有JointSemantic
和WeightSemantic
的顶点属性来完成的。
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 }
虽然可以通过嵌套 SequentialAnimation、ParallelAnimation 和 NumberAnimation 创建复杂的动画,但通常使用 时间线动画 来为骨骼模型动画化会更方便。
© 2024 Qt 公司有限公司。此处包含的文档贡献的版权归其各自所有者。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款授予许可。Qt 和相关标志是芬兰及/或全球其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。