Что это значит, когда gltf не указывает значение скелета в оболочке?

#c #json #animation #graphics #gltf

#c #json #Анимация #графика #gltf

Вопрос:

Читая исходный код 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 amp;) const;
};
  

Это заставило бы вас предположить, что значение скелета является обязательным. Однако в примере json простой оболочки gltf я вижу следующее:

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

  

Это полный объем skins массива. Таким образом, кажется, что для оболочки вполне возможно не указывать, какой из них является корневым узлом его скелета. В таком случае, какой узел в массиве соединений я должен обработать в родительском? Могу ли я с уверенностью предположить, что это первый элемент joints списка?

Ответ №1:

Из спецификации skin.skeleton glTF это «ближайший общий корень иерархии соединений или прямой или косвенный родительский узел ближайшего общего корня».

Не все движки или инструменты разработки имеют понятие «корня» в иерархии соединений, поэтому оно не требуется, но если он нужен вашему загрузчику, вы можете просто выбрать любой узел, который является общим предком других соединений, использовать сам корень сцены или вставить новый корень при загрузкевремя.

Комментарии:

1. ДА. Я выделю часть о некоторых загрузчиках, не нуждающихся в «корневом» соединении. Если данный механизм рендеринга не потрудился провести какое-либо различие между «узлом» и «костью» (суставом), тогда ему не нужно даже смотреть на поле скелета или заботиться о том, отсутствует ли оно. Он все равно может корректно анимировать оболочку без этого.