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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user