Fix transform data

Use first offsetMatrix for a bone (there may be multiple) and calculate using offsetOfParent * inverseRootOffset * rootOffset * inverseOffset

(cherry picked from commit a8eae976dda39ad28f9aa235e1e6ba34715ac48a)

# Conflicts:
#	Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTransformImporter.cpp
This commit is contained in:
amzn-mike
2021-06-09 22:35:03 -05:00
parent d841f0c0db
commit 66a030b800
@@ -46,8 +46,9 @@ namespace AZ
serializeContext->Class<AssImpTransformImporter, SceneCore::LoadingComponent>()->Version(1);
}
}
void GetAllBones(const aiScene* scene, AZStd::unordered_map<AZStd::string, const aiBone*>& boneLookup)
void GetAllBones(
const aiScene* scene, AZStd::unordered_multimap<AZStd::string, const aiBone*>& boneLookup)
{
for (unsigned meshIndex = 0; meshIndex < scene->mNumMeshes; ++meshIndex)
{
@@ -57,7 +58,7 @@ namespace AZ
{
const aiBone* bone = mesh->mBones[boneIndex];
boneLookup[bone->mName.C_Str()] = bone;
boneLookup.emplace(bone->mName.C_Str(), bone);
}
}
}
@@ -73,18 +74,19 @@ namespace AZ
return Events::ProcessingResult::Ignored;
}
AZStd::unordered_map<AZStd::string, const aiBone*> boneLookup;
AZStd::unordered_multimap<AZStd::string, const aiBone*> boneLookup;
GetAllBones(scene, boneLookup);
auto boneIterator = boneLookup.find(currentNode->mName.C_Str());
const bool isBone = boneIterator != boneLookup.end();
if (currentNode->mName.C_Str() == AZStd::string("FrontCloth_02"))
if (currentNode->mName.C_Str() == AZStd::string("spine_C0_0_jnt"))
{
__debugbreak();
//__debugbreak();
}
aiMatrix4x4 combinedTransform;
DataTypes::MatrixType finalMat;
if (isBone)
{
@@ -121,7 +123,16 @@ namespace AZ
while (curNode && boneLookup.count(curNode->mName.C_Str()))
{
AZStd::string name = curNode->mName.C_Str();
addOffset(name, boneLookup.at(name)->mOffsetMatrix);
auto range = boneLookup.equal_range(name);
for (auto it = range.first; it != range.second; ++it)
{
addOffset(name, it->second->mOffsetMatrix);
break;
}
//addOffset(name, boneLookup.at(name)->mOffsetMatrix);
addTransform(name, curNode->mTransformation);
curNode = curNode->mParent;
@@ -152,14 +163,24 @@ namespace AZ
//combinedTransform = parentOffset * inverseOffset;
//parentTransform ^-1 * parentParent * azOffsetInverse
combinedTransform = parentTransformInverse * rootOffsetMatrix * inverseOffset;
//combinedTransform = parentTransformInverse * rootOffsetMatrix * inverseOffset;
//azNodeLocal = offsets[1] * inverseOffsets[3] * (offsets[3] * inverseOffsets[0])
finalMat =
offsets.at(AZ::GetMin(offsets.size()-1, (decltype(offsets.size()))1)) * inverseOffsets.at(inverseOffsets.size() - 1) * offsets.at(offsets.size() - 1) * inverseOffsets.at(0);
}
else
{
combinedTransform = GetConcatenatedLocalTransform(currentNode);
}
DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform);
//DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform);
DataTypes::MatrixType localTransform = finalMat;
if (localTransform == DataTypes::MatrixType::Identity())
{
return Events::ProcessingResult::Ignored;
}
context.m_sourceSceneSystem.SwapTransformForUpAxis(localTransform);
context.m_sourceSceneSystem.ConvertUnit(localTransform);