Я пытаюсь разработать скелетную анимацию, используя Assimp (Open Asset Import Library). Прямо сейчас я могу успешно загрузить модель .dae и визуализировать ее с анимацией, но в процессе этого модель не работает.
http://i.imgur.com/O7YzK8o.png
Левая модель не установлена и не загружена должным образом. Модель справа сфальсифицирована и принимает правильную позу из анимации, но странным образом искажается (плоская фигурка ~).
Я полагаю, что я, вероятно, что-то делаю не так, умножая костный матрикс
окончательные матрицы (назовем их M) рассчитываются следующим образом:
M[i] = transform_matrix[i] * scene->mRootNode->mTransformation * offset_matrix[i]
где offset_matrix[i]
является комбинированной матрицей смещения от конкатенации aiBone->mOffsetMatrix
, а также transform_matrix[i]
является комбинированной матрицей преобразования из конкатенации матриц из aiNodeAnim
ТРС.
Соответствующие конкатенации выполняются снизу вверх и до корня.
while(node!=NULL){
mOffset = loadRelativeOffset(node, scene) * mOffset
node = node->mParent;
}
offset_matrix.push_back(mOffset);
loadRelativeOffset(node, scene)
будет проходить через scene->mMeshes[0]->mNumBones
и вернуть матрицу соответствия aiBone
, Если кость не найдена, будет возвращена идентификационная матрица. Таким образом, конечным результатом будет объединение всех костных матриц, игнорируя арматура и корневой узел.
Загрузка матрицы преобразования выполняется аналогичным образом, но с aiNodeAnim
в mNumChannels
вместо aiBones
в mNumBones
,
Я представляю, что конечный результат выглядит примерно так:
M = Arm * Hand * Finger * RootNode * Offset_Arm * Offset_Hand * Offset_Finger;
Я не знаю, почему существует матрица RootNode, но если ее там нет, все выглядит чепухой.
Любая идея, что вызывает это, или что я могу сделать?
Я решил это. Проблема была очень простой — матрицы смещения кости в aiBone
уже Глобальный / комбинированный, поэтому не было причин для объединения.