[Bf-extensions-cvs] [dbfb520] master: FBX Import: rework a bit transform code (this is needed for armature & anim handling).

Bastien Montagne noreply at git.blender.org
Sun Jul 13 18:10:36 CEST 2014


Commit: dbfb5209c007f05b4aab2afa252126f8ae8b4c32
Author: Bastien Montagne
Date:   Sun Jul 13 18:09:48 2014 +0200
https://developer.blender.org/rBAdbfb5209c007f05b4aab2afa252126f8ae8b4c32

FBX Import: rework a bit transform code (this is needed for armature & anim handling).

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

M	io_scene_fbx/import_fbx.py

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

diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py
index dc07a9b..c5a12e0 100644
--- a/io_scene_fbx/import_fbx.py
+++ b/io_scene_fbx/import_fbx.py
@@ -264,35 +264,63 @@ def elem_props_get_visibility(elem, elem_prop_id, default=None):
 
 # ------
 # Object
+from collections import namedtuple
 
-def blen_read_object(fbx_tmpl, fbx_obj, object_data):
-    elem_name, elem_class = elem_split_name_class(fbx_obj)
-    elem_name_utf8 = elem_name.decode('utf-8')
 
-    const_vector_zero_3d = 0.0, 0.0, 0.0
-    const_vector_one_3d = 1.0, 1.0, 1.0
+FBXTransformData = namedtuple("FBXTransformData", (
+    "loc",
+    "rot", "rot_ofs", "rot_piv", "pre_rot", "pst_rot", "rot_ord", "rot_alt_mat",
+    "sca", "sca_ofs", "sca_piv",
+))
 
-    # Object data must be created already
-    obj = bpy.data.objects.new(name=elem_name_utf8, object_data=object_data)
 
-    fbx_props = (elem_find_first(fbx_obj, b'Properties70'),
-                 elem_find_first(fbx_tmpl, b'Properties70', fbx_elem_nil))
-    assert(fbx_props[0] is not None)
+object_tdata_cache = {}
 
-    # ----
-    # Misc Attributes
 
-    obj.color[0:3] = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8))
-    obj.hide = not bool(elem_props_get_visibility(fbx_props, b'Visibility', 1.0))
+def blen_read_object_transform_do(transform_data):
+    from mathutils import Matrix, Euler
 
-    # ----
-    # Transformation
+    # translation
+    lcl_translation = Matrix.Translation(transform_data.loc)
+
+    # rotation
+    to_rot = lambda rot, rot_ord: Euler(convert_deg_to_rad_iter(rot), rot_ord).to_matrix().to_4x4()
+    lcl_rot = to_rot(transform_data.rot, transform_data.rot_ord) * transform_data.rot_alt_mat
+    pre_rot = to_rot(transform_data.pre_rot, transform_data.rot_ord)
+    pst_rot = to_rot(transform_data.pst_rot, transform_data.rot_ord)
+
+    rot_ofs = Matrix.Translation(transform_data.rot_ofs)
+    rot_piv = Matrix.Translation(transform_data.rot_piv)
+    sca_ofs = Matrix.Translation(transform_data.sca_ofs)
+    sca_piv = Matrix.Translation(transform_data.sca_piv)
+
+    # scale
+    lcl_scale = Matrix()
+    lcl_scale[0][0], lcl_scale[1][1], lcl_scale[2][2] = transform_data.sca
+
+    return (
+        lcl_translation *
+        rot_ofs *
+        rot_piv *
+        pre_rot *
+        lcl_rot *
+        pst_rot *
+        rot_piv.inverted() *
+        sca_ofs *
+        sca_piv *
+        lcl_scale *
+        sca_piv.inverted()
+    )
 
+
+def blen_read_object_transform_preprocess(fbx_props, fbx_obj, rot_alt_mat):
     # This is quite involved, 'fbxRNode.cpp' from openscenegraph used as a reference
+    const_vector_zero_3d = 0.0, 0.0, 0.0
+    const_vector_one_3d = 1.0, 1.0, 1.0
 
-    loc = elem_props_get_vector_3d(fbx_props, b'Lcl Translation', const_vector_zero_3d)
-    rot = elem_props_get_vector_3d(fbx_props, b'Lcl Rotation', const_vector_zero_3d)
-    sca = elem_props_get_vector_3d(fbx_props, b'Lcl Scaling', const_vector_one_3d)
+    loc = list(elem_props_get_vector_3d(fbx_props, b'Lcl Translation', const_vector_zero_3d))
+    rot = list(elem_props_get_vector_3d(fbx_props, b'Lcl Rotation', const_vector_zero_3d))
+    sca = list(elem_props_get_vector_3d(fbx_props, b'Lcl Scaling', const_vector_one_3d))
 
     rot_ofs = elem_props_get_vector_3d(fbx_props, b'RotationOffset', const_vector_zero_3d)
     rot_piv = elem_props_get_vector_3d(fbx_props, b'RotationPivot', const_vector_zero_3d)
@@ -318,12 +346,34 @@ def blen_read_object(fbx_tmpl, fbx_obj, object_data):
         pst_rot = const_vector_zero_3d
         rot_ord = 'XYZ'
 
-    from mathutils import Matrix, Euler
+    return FBXTransformData(loc,
+                            rot, rot_ofs, rot_piv, pre_rot, pst_rot, rot_ord, rot_alt_mat,
+                            sca, sca_ofs, sca_piv)
 
-    # translation
-    lcl_translation = Matrix.Translation(loc)
 
-    # rotation
+def blen_read_object(fbx_tmpl, fbx_obj, object_data):
+    elem_name_utf8 = elem_name_ensure_class(fbx_obj)
+
+    # Object data must be created already
+    obj = bpy.data.objects.new(name=elem_name_utf8, object_data=object_data)
+
+    fbx_props = (elem_find_first(fbx_obj, b'Properties70'),
+                 elem_find_first(fbx_tmpl, b'Properties70', fbx_elem_nil))
+    assert(fbx_props[0] is not None)
+
+    # ----
+    # Misc Attributes
+
+    obj.color[0:3] = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8))
+    obj.hide = not bool(elem_props_get_visibility(fbx_props, b'Visibility', 1.0))
+
+    # ----
+    # Transformation
+
+    from mathutils import Matrix
+    from math import pi
+
+    # rotation corrections
     if obj.type == 'CAMERA':
         rot_alt_mat = MAT_CONVERT_CAMERA
     elif obj.type == 'LAMP':
@@ -331,37 +381,16 @@ def blen_read_object(fbx_tmpl, fbx_obj, object_data):
     else:
         rot_alt_mat = Matrix()
 
-    # rotation
-    lcl_rot = Euler(convert_deg_to_rad_iter(rot), rot_ord).to_matrix().to_4x4() * rot_alt_mat
-    pre_rot = Euler(convert_deg_to_rad_iter(pre_rot), rot_ord).to_matrix().to_4x4()
-    pst_rot = Euler(convert_deg_to_rad_iter(pst_rot), rot_ord).to_matrix().to_4x4()
-
-    rot_ofs = Matrix.Translation(rot_ofs)
-    rot_piv = Matrix.Translation(rot_piv)
-    sca_ofs = Matrix.Translation(sca_ofs)
-    sca_piv = Matrix.Translation(sca_piv)
-
-    # scale
-    lcl_scale = Matrix()
-    lcl_scale[0][0], lcl_scale[1][1], lcl_scale[2][2] = sca
-
-    obj.matrix_basis = (
-        lcl_translation *
-        rot_ofs *
-        rot_piv *
-        pre_rot *
-        lcl_rot *
-        pst_rot *
-        rot_piv.inverted() *
-        sca_ofs *
-        sca_piv *
-        lcl_scale *
-        sca_piv.inverted()
-        )
+    transform_data = object_tdata_cache.get(obj)
+    if transform_data is None:
+        transform_data = blen_read_object_transform_preprocess(fbx_props, fbx_obj, rot_alt_mat)
+        object_tdata_cache[obj] = transform_data
+    obj.matrix_basis = blen_read_object_transform_do(transform_data)
 
     return obj
 
 
+
 # ----
 # Mesh



More information about the Bf-extensions-cvs mailing list