[Bf-extensions-cvs] [c6a804b] master: Simplify Export transformations handling, some other minor cleanup.

Bastien Montagne noreply at git.blender.org
Sun Jul 13 18:00:04 CEST 2014


Commit: c6a804b9e285a99274d2f9cf22ac2c713ed58e70
Author: Bastien Montagne
Date:   Sun Jul 13 17:56:32 2014 +0200
https://developer.blender.org/rBAc6a804b9e285a99274d2f9cf22ac2c713ed58e70

Simplify Export transformations handling, some other minor cleanup.

This itegrates a small part of D607.

===================================================================

M	io_scene_fbx/fbx_utils.py
M	io_scene_fbx/import_fbx.py

===================================================================

diff --git a/io_scene_fbx/fbx_utils.py b/io_scene_fbx/fbx_utils.py
index 2f203dd..d8fcf7a 100644
--- a/io_scene_fbx/fbx_utils.py
+++ b/io_scene_fbx/fbx_utils.py
@@ -72,7 +72,8 @@ FBX_KTIME = 46186158000  # This is the number of "ktimes" in one second (yep, pr
 
 MAT_CONVERT_LAMP = Matrix.Rotation(math.pi / 2.0, 4, 'X')  # Blender is -Z, FBX is -Y.
 MAT_CONVERT_CAMERA = Matrix.Rotation(math.pi / 2.0, 4, 'Y')  # Blender is -Z, FBX is +X.
-#MAT_CONVERT_BONE = Matrix.Rotation(math.pi / -2.0, 4, 'X')  # Blender is +Y, FBX is +Z.
+# XXX I can't get this working :(
+#MAT_CONVERT_BONE = Matrix.Rotation(math.pi / 2.0, 4, 'Z')  # Blender is +Y, FBX is -X.
 MAT_CONVERT_BONE = Matrix()
 
 
@@ -914,11 +915,10 @@ class ObjectWrapper(metaclass=MetaObjectWrapper):
         return False
 
     def use_bake_space_transform(self, scene_data):
-        # NOTE: Only applies to object types supporting this!!! Currently, only meshes...
-        #       Also, do not apply it to children objects.
+        # NOTE: Only applies to object types supporting this!!! Currently, only meshes and the like...
         # TODO: Check whether this can work for bones too...
-        return (scene_data.settings.bake_space_transform and self._tag == 'OB' and
-                self.bdata.type in BLENDER_OBJECT_TYPES_MESHLIKE and not self.has_valid_parent(scene_data.objects))
+        return (scene_data.settings.bake_space_transform and self._tag in {'OB', 'DP'} and
+                self.bdata.type in BLENDER_OBJECT_TYPES_MESHLIKE)
 
     def fbx_object_matrix(self, scene_data, rest=False, local_space=False, global_space=False):
         """
@@ -936,34 +936,32 @@ class ObjectWrapper(metaclass=MetaObjectWrapper):
         is_global = (not local_space and
                      (global_space or not (self._tag in {'DP', 'BO'} or self.has_valid_parent(scene_data.objects))))
 
+        # Since we have to apply corrections to some types of object, we always need local Blender space here...
+        matrix = self.matrix_rest_local if rest else self.matrix_local
+        parent = self.parent
+
+        # Bones, lamps and cameras need to be rotated (in local space!).
         if self._tag == 'BO':
-            if rest:
-                matrix = self.matrix_rest_global if is_global else self.matrix_rest_local
-            else:  # Current pose.
-                matrix = self.matrix_global if is_global else self.matrix_local
-        else:
-            # Since we have to apply corrections to some types of object, we always need local Blender space here...
-            matrix = self.matrix_local
-            parent = self.parent
-
-            # Lamps and cameras need to be rotated (in local space!).
-            if self.bdata.type == 'LAMP':
-                matrix = matrix * MAT_CONVERT_LAMP
-            elif self.bdata.type == 'CAMERA':
-                matrix = matrix * MAT_CONVERT_CAMERA
-
-            # Our matrix is in local space, time to bring it in its final desired space.
-            if parent:
-                if is_global:
-                    # Move matrix to global Blender space.
-                    matrix = parent.matrix_global * matrix
-                elif parent.use_bake_space_transform(scene_data):
-                    # Blender's and FBX's local space of parent may differ if we use bake_space_transform...
-                    # Apply parent's *Blender* local space...
-                    matrix = parent.matrix_local * matrix
-                    # ...and move it back into parent's *FBX* local space.
-                    par_mat = parent.fbx_object_matrix(scene_data, local_space=True)
-                    matrix = par_mat.inverted() * matrix
+            # XXX This should work smoothly, but actually is only OK for 'rest' pose, actual pose/animations
+            #     give insane results... :(
+            matrix = matrix * MAT_CONVERT_BONE
+        elif self.bdata.type == 'LAMP':
+            matrix = matrix * MAT_CONVERT_LAMP
+        elif self.bdata.type == 'CAMERA':
+            matrix = matrix * MAT_CONVERT_CAMERA
+
+        # Our matrix is in local space, time to bring it in its final desired space.
+        if parent:
+            if is_global:
+                # Move matrix to global Blender space.
+                matrix = (parent.matrix_rest_global if rest else parent.matrix_global) * matrix
+            elif parent.use_bake_space_transform(scene_data):
+                # Blender's and FBX's local space of parent may differ if we use bake_space_transform...
+                # Apply parent's *Blender* local space...
+                matrix = (parent.matrix_rest_local if rest else parent.matrix_local) * matrix
+                # ...and move it back into parent's *FBX* local space.
+                par_mat = parent.fbx_object_matrix(scene_data, rest=rest, local_space=True)
+                matrix = par_mat.inverted() * matrix
 
         if self.use_bake_space_transform(scene_data):
             # If we bake the transforms we need to post-multiply inverse global transform.
diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py
index 91ac89c..dc07a9b 100644
--- a/io_scene_fbx/import_fbx.py
+++ b/io_scene_fbx/import_fbx.py
@@ -52,6 +52,10 @@ fbx_elem_nil = None
 # Units convertors...
 convert_deg_to_rad_iter = units_convertor_iter("degree", "radian")
 
+MAT_CONVERT_BONE = fbx_utils.MAT_CONVERT_BONE.inverted()
+MAT_CONVERT_LAMP = fbx_utils.MAT_CONVERT_LAMP.inverted()
+MAT_CONVERT_CAMERA = fbx_utils.MAT_CONVERT_CAMERA.inverted()
+
 
 def elem_find_first(elem, id_search, default=None):
     for fbx_item in elem.elems:
@@ -315,16 +319,15 @@ def blen_read_object(fbx_tmpl, fbx_obj, object_data):
         rot_ord = 'XYZ'
 
     from mathutils import Matrix, Euler
-    from math import pi
 
     # translation
     lcl_translation = Matrix.Translation(loc)
 
     # rotation
     if obj.type == 'CAMERA':
-        rot_alt_mat = Matrix.Rotation(pi / -2.0, 4, 'Y')
+        rot_alt_mat = MAT_CONVERT_CAMERA
     elif obj.type == 'LAMP':
-        rot_alt_mat = Matrix.Rotation(pi / -2.0, 4, 'X')
+        rot_alt_mat = MAT_CONVERT_LAMP
     else:
         rot_alt_mat = Matrix()
 
@@ -756,6 +759,8 @@ def blen_read_shape(fbx_tmpl, fbx_sdata, fbx_bcdata, meshes, scene, global_matri
     assert(len(vgweights) == len(indices) == len(dvcos))
     create_vg = bool(set(vgweights) - {1.0})
 
+    keyblocks = []
+
     for me, objects in meshes:
         vcos = tuple((idx, me.vertices[idx].co + Vector(dvco)) for idx, dvco in zip(indices, dvcos))
         objects = list({blen_o for fbx_o, blen_o in objects})
@@ -776,6 +781,10 @@ def blen_read_shape(fbx_tmpl, fbx_sdata, fbx_bcdata, meshes, scene, global_matri
             add_vgroup_to_objects(indices, vgweights, elem_name_utf8, objects)
             kb.vertex_group = elem_name_utf8
 
+        keyblocks.append(kb)
+
+    return keyblocks
+
 
 # --------
 # Material
@@ -1246,14 +1255,14 @@ def load(operator, context, filepath="",
             fbx_obj, blen_data = fbx_item
             if fbx_obj.id != b'Model':
                 continue
-            if fbx_item[1] is None:
+            if blen_data is None:
                 continue  # no object loaded.. ignore
 
             for (fbx_lnk,
                  fbx_lnk_item,
                  fbx_lnk_type) in connection_filter_forward(fbx_uuid, b'Model'):
 
-                fbx_item[1].parent = fbx_lnk_item
+                blen_data.parent = fbx_lnk_item
     _(); del _
 
     def _():
@@ -1263,11 +1272,11 @@ def load(operator, context, filepath="",
                 fbx_obj, blen_data = fbx_item
                 if fbx_obj.id != b'Model':
                     continue
-                if fbx_item[1] is None:
+                if blen_data is None:
                     continue  # no object loaded.. ignore
 
-                if fbx_item[1].parent is None:
-                    fbx_item[1].matrix_basis = global_matrix * fbx_item[1].matrix_basis
+                if blen_data.parent is None:
+                    blen_data.matrix_basis = global_matrix * blen_data.matrix_basis
     _(); del _
 
     def _():



More information about the Bf-extensions-cvs mailing list