You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:06:27