From 0005f2b9da7914fcbcac7a4eb799584bac7e81f4 Mon Sep 17 00:00:00 2001 From: AMZN-stankowi <4838196+AMZN-stankowi@users.noreply.github.com> Date: Tue, 10 Aug 2021 06:47:14 -0700 Subject: [PATCH] Updated skeleton logic: (#2957) Import all nodes as bones. O3DE's concept of a bone is different than AssImp's. Updated GetLocalSpaceBindPoseTransform to only use the offset matrix if the parent is also a bone. Results: All test assets I've tried match Blender's "Rest Position" when loaded in the Character tool. All test animations I've tried work generally as well as they worked before, and a few better. This resolves the issue that was originally opened, an internal test asset loaded the skeleton incorrectly. Signed-off-by: stankowi <4838196+AMZN-stankowi@users.noreply.github.com> --- .../SceneAPI/SceneBuilder/Importers/AssImpBoneImporter.cpp | 4 ---- .../SceneBuilder/Importers/AssImpImporterUtilities.cpp | 7 +------ 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpBoneImporter.cpp b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpBoneImporter.cpp index eeddf4a0b3..a42870c426 100644 --- a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpBoneImporter.cpp +++ b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpBoneImporter.cpp @@ -103,10 +103,6 @@ namespace AZ } } - if(!isBone) - { - return Events::ProcessingResult::Ignored; - } // If the current scene node (our eventual parent) contains bone data, we are not a root bone AZStd::shared_ptr createdBoneData; diff --git a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpImporterUtilities.cpp b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpImporterUtilities.cpp index 81feff7d69..d416324240 100644 --- a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpImporterUtilities.cpp +++ b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpImporterUtilities.cpp @@ -135,18 +135,13 @@ namespace AZ const aiBone* bone = FindFirstBoneByNodeName(node, boneByNameMap); if (bone) { - const DataTypes::MatrixType inverseOffsetMatrix = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(bone->mOffsetMatrix).GetInverseFull(); - const aiBone* parentBone = FindFirstBoneByNodeName(node->mParent, boneByNameMap); if (parentBone) { + DataTypes::MatrixType inverseOffsetMatrix = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(bone->mOffsetMatrix).GetInverseFull(); const DataTypes::MatrixType parentBoneOffsetMatrix = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(parentBone->mOffsetMatrix); return parentBoneOffsetMatrix * inverseOffsetMatrix; } - else - { - return inverseOffsetMatrix; - } } return AssImpSDKWrapper::AssImpTypeConverter::ToTransform(GetConcatenatedLocalTransform(node));