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