如何从glTF JSON文件中获取各骨骼的权重数据
从glTF JSON提取单骨骼对应权重数据的实现方式
glTF 2.0的蒙皮权重存储遵循固定规范,结合你提供的文件,按以下步骤操作即可拿到目标数据:
1. 定位蒙皮核心属性
首先找到带蒙皮的网格图元(primitive),你文件中meshes[0].primitives[0].attributes下已经给出两个关键属性的访问器索引:
JOINTS_0: 3:对应accessors[3],存储每个顶点的影响骨骼索引WEIGHTS_0: 4:对应accessors[4],存储每个顶点对应影响骨骼的权重值
两个访问器的count均为317,和网格顶点总数一致,且均为VEC4类型,即默认每个顶点最多受4根骨骼影响,符合标准glTF的蒙皮存储规则。
2. 读取二进制缓冲解析原始值
权重和骨骼索引都存在外部二进制文件manoe.bin中,需要结合bufferView和componentType配置读取:
JOINTS_0(accessors[3]):componentType值为5121,对应无符号字节(UNSIGNED_BYTE,单分量占1字节),关联bufferViews[3],从bin文件10144字节偏移位置开始读取,总长度1268字节。每个顶点对应4个无符号字节值,即为该顶点4个影响骨骼的序号。WEIGHTS_0(accessors[4]):componentType值为5126,对应32位浮点数(FLOAT,单分量占4字节),关联bufferViews[4],从bin文件11412字节偏移位置开始读取,总长度5072字节。每个顶点对应4个浮点值,和同位置的JOINTS_0值一一对应,即为对应骨骼的影响权重,同一顶点的4个权重值加和为1。
3. 建立关节索引到实际骨骼的映射
注意JOINTS_0中存储的索引不是nodes数组的直接下标,需要先通过skin定义做映射:
你文件中蒙皮定义在skins[0],其joints数组值为[4, 3, 1, 0, 2],该数组的下标即为JOINTS_0中存储的关节索引,数组元素为nodes数组中真实的骨骼节点下标,映射关系如下:
- 关节索引0 → nodes[4] → 骨骼名
Bone - 关节索引1 → nodes[3] → 骨骼名
Bone.001 - 关节索引2 → nodes[1] → 骨骼名
Bone.002 - 关节索引3 → nodes[0] → 骨骼名
Bone.004 - 关节索引4 → nodes[2] → 骨骼名
Bone.003
4. 按骨骼聚合权重数据
完成映射后遍历所有顶点即可得到单骨骼对应的权重:
- 逐顶点读取4组(关节索引,权重)配对值
- 跳过权重为0的无效配对,将权重值和对应顶点ID关联到对应骨骼下
- 最终输出结果为每根骨骼关联的所有顶点ID、以及每个顶点受该骨骼影响的权重值
校验提示:你提供的文件中
skins[0].inverseBindMatrices对应访问器count为5,和骨骼总数一致,蒙皮相关字段完整无缺失,可直接按上述逻辑解析。
内容的提问来源于stack exchange,提问作者SiperStrengh
相关产品推荐
相关产品推荐

