Я пытаюсь следовать руководству по здесь (по адресу ogldev) упомянул в этом ответе .
Однако я столкнулся с несколькими проблемами, в которые, как мне кажется,быть связанным с Главным Орденом Строки для Ассимпа и Главного Ордена Столба для GLM, хотя я совершенно не уверен.
Я пробовал несколько вариантов и приказов, чтобы увидеть, работает ли какой-либо из них, но чтобыбезрезультатно.
Здесь (Gist) - это класс, который я использую для загрузки полного файла MD5.И текущий результат, который у меня есть.
И это та часть, где я думаю, что она идет не так, когда я пытаюсь обновить матрицы преобразования кости.
void SkeletalModel::ReadNodeHierarchyAnimation(float _animationTime, const aiNode* _node,
const glm::mat4& _parentTransform)
{
std::string node_name = _node->mName.data;
const aiAnimation * p_animation = scene->mAnimations[0];
glm::mat4 node_transformation(1.0f);
convert_aimatrix_to_glm(node_transformation, _node->mTransformation);
// Transpose it.
node_transformation = glm::transpose(node_transformation);
const aiNodeAnim * node_anim = FindNodeAnim(p_animation, node_name);
if (node_anim) {
//glm::mat4 transformation_matrix(1.0f);
glm::mat4 translation_matrix(1.0f);
glm::mat4 rotation_matrix(1.0f);
glm::mat4 scaling_matrix(1.0f);
aiVector3D translation;
CalcInterpolatedPosition(translation, _animationTime, node_anim);
translation_matrix = glm::translate(translation_matrix, glm::vec3(translation.x, translation.y, translation.z));
aiQuaternion rotation;
CalcInterpolatedRotation(rotation, _animationTime, node_anim);
// Transpose the matrix after this.
convert_aimatrix_to_glm(rotation_matrix, rotation.GetMatrix());
//rotation_matrix = glm::transpose(rotation_matrix);
aiVector3D scaling;
CalcInterpolatedScaling(scaling, _animationTime, node_anim);
scaling_matrix = glm::scale(scaling_matrix, glm::vec3(scaling.x, scaling.y, scaling.z));
node_transformation = scaling_matrix * rotation_matrix * translation_matrix;
//node_transformation = translation_matrix * rotation_matrix * scaling_matrix;
}
glm::mat4 global_transformation = node_transformation * _parentTransform;
if (boneMapping.find(node_name) != boneMapping.end()) {
// Update the Global Transformation.
auto bone_index = boneMapping[node_name];
//boneInfoData[bone_index].finalTransformation = globalInverseTransform * global_transformation * boneInfoData[bone_index].boneOffset;
boneInfoData[bone_index].finalTransformation = boneInfoData[bone_index].boneOffset * global_transformation * globalInverseTransform;
//boneInfoData[bone_index].finalTransformation = globalInverseTransform;
}
for (auto i = 0; i < _node->mNumChildren; i++) {
ReadNodeHierarchyAnimation(_animationTime, _node->mChildren[i], global_transformation);
}
}
Мой текущий вывод:
Я попытался просмотреть каждую матрицу, использованную в коде, чтобы проверить, следует ли мне ее транспонировать или нет.Должен ли я изменить порядок умножения матриц или нет.Я не мог найти свою проблему.
Если кто-то может указать на мои ошибки здесь или направить меня к другому учебнику, который поможет мне загружать анимацию, это было бы здорово.
Кроме того, я вижу предложения использовать базовую модель вначальные этапы изучения этого.Но мне сказали, что формат Obj не поддерживает анимацию, и до этого я использовал только Obj.Могу ли я использовать любые другие форматы, которые экспортирует Blender, аналогично MD5, как показано в этом руководстве?