gltf 没有在皮肤中指定骨架值是什么意思?

What does it mean when gltf does not specify a skeleton value in a skin?

阅读tinygltf的源代码我看到了这个:

struct Skin {
  std::string name;
  int inverseBindMatrices;  // required here but not in the spec
  int skeleton;             // The index of the node used as a skeleton root
  std::vector<int> joints;  // Indices of skeleton nodes

  Value extras;
  ExtensionMap extensions;

  // Filled when SetStoreOriginalJSONForExtrasAndExtensions is enabled.
  std::string extras_json_string;
  std::string extensions_json_string;

  Skin() {
    inverseBindMatrices = -1;
    skeleton = -1;
  }
  DEFAULT_METHODS(Skin)
  bool operator==(const Skin &) const;
};

这会让您假设骨架值是强制性的。但是,在 gltf 简单皮肤示例 json 上,我看到以下内容:

  "skins" : [ {
    "inverseBindMatrices" : 4,
    "joints" : [ 1, 2 ]
  } ],

这是 skins 数组的完整范围。因此,皮肤完全可以不指定哪个是其骨架的根节点。在那种情况下,我应该在父级处理关节数组中的哪个节点?我可以安全地假设它是 joints 列表的第一个元素吗?

From the glTF specification,skin.skeleton是“关节层级的最近公共根或最近公共根的直接或间接父节点”。

并非所有引擎或创作工具在联合层次结构中都有“根”的概念,因此这不是必需的,但如果您的加载程序需要一个,您可以简单地选择任何作为共同祖先的节点其他关节,使用场景根本身,或者在加载时插入一个新的根。