Browse Source

- Bugfix #3457587: correct decomposition of matrices with negative scaling. Thanks to anonymous google account user for the fix.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1099 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
ulfjorensen 13 years ago
parent
commit
a73397198c
2 changed files with 9 additions and 1 deletions
  1. 2 1
      code/ColladaLoader.cpp
  2. 7 0
      include/aiMatrix4x4.inl

+ 2 - 1
code/ColladaLoader.cpp

@@ -1084,8 +1084,9 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars
 
 
 		for( size_t a = 0; a < resultTrafos.size(); ++a)
 		for( size_t a = 0; a < resultTrafos.size(); ++a)
 		{
 		{
-			const aiMatrix4x4& mat = resultTrafos[a];
+			aiMatrix4x4 mat = resultTrafos[a];
 			double time = double( mat.d4); // remember? time is stored in mat.d4
 			double time = double( mat.d4); // remember? time is stored in mat.d4
+      mat.d4 = 1.0f;
 
 
 			dstAnim->mPositionKeys[a].mTime = time;
 			dstAnim->mPositionKeys[a].mTime = time;
 			dstAnim->mRotationKeys[a].mTime = time;
 			dstAnim->mRotationKeys[a].mTime = time;

+ 7 - 0
include/aiMatrix4x4.inl

@@ -217,6 +217,13 @@ inline void aiMatrix4x4::Decompose (aiVector3D& scaling, aiQuaternion& rotation,
 	scaling.y = vRows[1].Length();
 	scaling.y = vRows[1].Length();
 	scaling.z = vRows[2].Length();
 	scaling.z = vRows[2].Length();
 
 
+	// and the sign of the scaling
+	if (Determinant() < 0) {
+		scaling.x = -scaling.x;
+		scaling.y = -scaling.y;
+		scaling.z = -scaling.z;
+	}
+
 	// and remove all scaling from the matrix
 	// and remove all scaling from the matrix
 	if(scaling.x)
 	if(scaling.x)
 	{
 	{