浏览代码

- blend: compute parent inverses on your own instead of trusting the blend input. Thanks to Kalmár Dániel for the patch.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1291 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
aramis_acg 13 年之前
父节点
当前提交
d8c2295962
共有 2 个文件被更改,包括 8 次插入11 次删除
  1. 6 10
      code/BlenderLoader.cpp
  2. 2 1
      code/BlenderLoader.h

+ 6 - 10
code/BlenderLoader.cpp

@@ -360,7 +360,7 @@ void BlenderImporter::ConvertBlendFile(aiScene* out, const Scene& in,const FileD
 	root->mNumChildren = static_cast<unsigned int>(no_parents.size());
 	root->mChildren = new aiNode*[root->mNumChildren]();
 	for (unsigned int i = 0; i < root->mNumChildren; ++i) {
-		root->mChildren[i] = ConvertNode(in, no_parents[i], conv);	
+		root->mChildren[i] = ConvertNode(in, no_parents[i], conv, aiMatrix4x4());	
 		root->mChildren[i]->mParent = root;
 	}
 
@@ -882,7 +882,7 @@ aiLight* BlenderImporter::ConvertLight(const Scene& /*in*/, const Object* /*obj*
 }
 
 // ------------------------------------------------------------------------------------------------
-aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, ConversionData& conv_data) 
+aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, ConversionData& conv_data, const aiMatrix4x4& parentTransform)
 {
 	std::deque<const Object*> children;
 	for(std::set<const Object*>::iterator it = conv_data.objects.begin(); it != conv_data.objects.end() ;) {
@@ -966,16 +966,12 @@ aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, Convers
 
 	for(unsigned int x = 0; x < 4; ++x) {
 		for(unsigned int y = 0; y < 4; ++y) {
-			node->mTransformation[y][x] = obj->parentinv[x][y];
+			node->mTransformation[y][x] = obj->obmat[x][y];
 		}
 	}
 
-	aiMatrix4x4 m;
-	for(unsigned int x = 0; x < 4; ++x) {
-		for(unsigned int y = 0; y < 4; ++y) {
-			m[y][x] = obj->obmat[x][y];
-		}
-	}
+	aiMatrix4x4 m = parentTransform;
+	m = m.Inverse();
 
 	node->mTransformation = m*node->mTransformation;
 	
@@ -983,7 +979,7 @@ aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, Convers
 		node->mNumChildren = static_cast<unsigned int>(children.size());
 		aiNode** nd = node->mChildren = new aiNode*[node->mNumChildren]();
 		for_each (const Object* nobj,children) {
-			*nd = ConvertNode(in,nobj,conv_data);
+			*nd = ConvertNode(in,nobj,conv_data,node->mTransformation * parentTransform);
 			(*nd++)->mParent = node;
 		}
 	}

+ 2 - 1
code/BlenderLoader.h

@@ -145,7 +145,8 @@ private:
 	// --------------------
 	aiNode* ConvertNode(const Blender::Scene& in, 
 		const Blender::Object* obj, 
-		Blender::ConversionData& conv_info
+		Blender::ConversionData& conv_info,
+		const aiMatrix4x4& parentTransform
 	); 
 
 	// --------------------