[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33984] trunk/blender/release/scripts/op/ io_anim_bvh: bvh export

Campbell Barton ideasman42 at gmail.com
Sat Jan 1 11:38:28 CET 2011


Revision: 33984
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33984
Author:   campbellbarton
Date:     2011-01-01 11:38:28 +0100 (Sat, 01 Jan 2011)

Log Message:
-----------
bvh export
- write compatible eulers (no jumping as eulers change).
- write FPS.
- correct poll function incase bvh export is called without an armature.

Modified Paths:
--------------
    trunk/blender/release/scripts/op/io_anim_bvh/__init__.py
    trunk/blender/release/scripts/op/io_anim_bvh/export_bvh.py

Modified: trunk/blender/release/scripts/op/io_anim_bvh/__init__.py
===================================================================
--- trunk/blender/release/scripts/op/io_anim_bvh/__init__.py	2011-01-01 09:44:13 UTC (rev 33983)
+++ trunk/blender/release/scripts/op/io_anim_bvh/__init__.py	2011-01-01 10:38:28 UTC (rev 33984)
@@ -69,9 +69,14 @@
     filter_glob = StringProperty(default="*.bvh", options={'HIDDEN'})
 
     global_scale = FloatProperty(name="Scale", description="Scale the BVH by this value", min=0.0001, max=1000000.0, soft_min=0.001, soft_max=100.0, default=1.0)
-    frame_start = IntProperty(name="Start Frame", description="Starting frame to export")
-    frame_end = IntProperty(name="End Frame", description="End frame to export")
+    frame_start = IntProperty(name="Start Frame", description="Starting frame to export", default=0)
+    frame_end = IntProperty(name="End Frame", description="End frame to export", default=0)
 
+    @classmethod
+    def poll(cls, context):
+        obj = context.object
+        return obj and obj.type == 'ARMATURE'
+
     def invoke(self, context, event):
         self.frame_start = context.scene.frame_start
         self.frame_end = context.scene.frame_end
@@ -79,7 +84,13 @@
         return super().invoke(context, event)
 
     def execute(self, context):
+        if self.frame_start == 0 and self.frame_end == 0:
+            self.frame_start = context.scene.frame_start
+            self.frame_end = context.scene.frame_end
+
         from . import export_bvh
+        import imp
+        imp.reload(export_bvh)
         return export_bvh.save(self, context, **self.as_keywords(ignore=("check_existing", "filter_glob")))
 
 

Modified: trunk/blender/release/scripts/op/io_anim_bvh/export_bvh.py
===================================================================
--- trunk/blender/release/scripts/op/io_anim_bvh/export_bvh.py	2011-01-01 09:44:13 UTC (rev 33983)
+++ trunk/blender/release/scripts/op/io_anim_bvh/export_bvh.py	2011-01-01 10:38:28 UTC (rev 33984)
@@ -25,7 +25,7 @@
 
 def _read(context, filepath, frame_start, frame_end, global_scale=1.0):
 
-    from mathutils import Matrix, Vector
+    from mathutils import Matrix, Vector, Euler
     from math import degrees
 
     file = open(filepath, "w")
@@ -130,8 +130,9 @@
         "rest_local_mat",  # blender rest batrix (local space)
         "pose_imat",  # pose_mat inverted
         "rest_arm_imat",  # rest_arm_mat inverted
-        "rest_local_imat")  # rest_local_mat inverted
-
+        "rest_local_imat",  # rest_local_mat inverted
+        "prev_euler",  # last used euler to preserve euler compability inbetween keyframes
+        )
         def __init__(self, bone_name):
             self.name = bone_name
             self.rest_bone = arm.bones[bone_name]
@@ -149,6 +150,7 @@
             self.rest_local_imat = self.rest_local_mat.copy().invert()
 
             self.parent = None
+            self.prev_euler = Euler((0.0, 0.0, 0.0))
 
         def update_posedata(self):
             self.pose_mat = self.pose_bone.matrix
@@ -174,41 +176,39 @@
     del bones_decorated_dict
     # finish assigning parents
 
+    scene = bpy.context.scene
+
     file.write("MOTION\n")
     file.write("Frames: %d\n" % (frame_end - frame_start + 1))
-    file.write("Frame Time: %.6f\n" % 0.03)
+    file.write("Frame Time: %.6f\n" % (1.0 / (scene.render.fps / scene.render.fps_base)))
 
-    scene = bpy.context.scene
-
-    triple = "%.6f %.6f %.6f "
     for frame in range(frame_start, frame_end + 1):
         scene.frame_set(frame)
-        obj.update(scene, 1,1,1)
-        scene.update()
+
         for dbone in bones_decorated:
             dbone.update_posedata()
+
         for dbone in bones_decorated:
+            trans = Matrix.Translation(dbone.rest_bone.head_local)
+            itrans = Matrix.Translation(-dbone.rest_bone.head_local)
+
             if  dbone.parent:
-                trans = Matrix.Translation(dbone.rest_bone.head_local)
-                itrans = Matrix.Translation(-dbone.rest_bone.head_local)
-                mat2 = dbone.parent.rest_arm_mat * dbone.parent.pose_imat * dbone.pose_mat * dbone.rest_arm_imat
-                mat2 = itrans * mat2 * trans
-                
-                myloc = mat2.translation_part() + (dbone.rest_bone.head_local - dbone.parent.rest_bone.head_local)
-                rot = mat2.copy().transpose().to_euler()
+                mat_final = dbone.parent.rest_arm_mat * dbone.parent.pose_imat * dbone.pose_mat * dbone.rest_arm_imat
+                mat_final = itrans * mat_final * trans
+                loc = mat_final.translation_part() + (dbone.rest_bone.head_local - dbone.parent.rest_bone.head_local)
             else:
-                trans = Matrix.Translation(dbone.rest_bone.head_local)
-                itrans = Matrix.Translation(-dbone.rest_bone.head_local)
+                mat_final = dbone.pose_mat * dbone.rest_arm_imat
+                mat_final = itrans * mat_final * trans
+                loc = mat_final.translation_part() + dbone.rest_bone.head
 
-                mat2 = dbone.pose_mat * dbone.rest_arm_imat
-                mat2 = itrans * mat2 * trans
-                
-                myloc = mat2.translation_part() + dbone.rest_bone.head_local
-                rot = mat2.copy().transpose().to_euler()
+            # keep eulers compatible, no jumping on interpolation.
+            rot = mat_final.rotation_part().invert().to_euler('XYZ', dbone.prev_euler)
 
-            file.write(triple % (myloc[0] * global_scale, myloc[1] * global_scale, myloc[2] * global_scale))
-            file.write(triple % (-degrees(rot[0]), -degrees(rot[1]), -degrees(rot[2])))
+            file.write("%.6f %.6f %.6f " % (loc * global_scale)[:])
+            file.write("%.6f %.6f %.6f " % (-degrees(rot[0]), -degrees(rot[1]), -degrees(rot[2])))
 
+            dbone.prev_euler = rot
+
         file.write("\n")
 
     file.close()





More information about the Bf-blender-cvs mailing list