OSDN Git Service

separate vertex with uv or normal.
[meshio/meshio.git] / swig / blender25 / import_anim_vmd.py
index eb43ee5..923fb34 100644 (file)
@@ -2,11 +2,14 @@
 
 __author__= ['ousttrue']
 __url__ = ("")
-__version__= '20100515 0.1:'
+__version__= '20100515 0.2:'
 __bpydoc__= '''\
 vmd Importer
 
 This script imports a vmd into Blender for editing.
+0.1 2010/05/15 first implement.
+0.2 2010/05/16 implement bone animation.
+0.3 2010/05/16 implement shape key animation.
 '''
 
 import bpy
@@ -31,7 +34,8 @@ def clampDegree(d):
 
 
 def multQuat(l, r):
-    q=mathutils.Quaternion((0, 0, 0), l.w*r.w-(l.x*r.x+l.y*r.y+l.z*r.z))
+    q=mathutils.Quaternion()
+    q.w=l.w*r.w-(l.x*r.x+l.y*r.y+l.z*r.z)
     q.x=l.w*r.x+r.w*l.x+l.y*r.z-l.z*r.y
     q.y=l.w*r.y+r.w*l.y+l.z*r.x-l.x*r.z
     q.z=l.w*r.z+r.w*l.z+l.x*r.y-l.y*r.x
@@ -40,7 +44,8 @@ def multQuat(l, r):
 
 def import_motion_key(l, o):
     print('import_motion_key: %s' % o.name)
-    
+
+   
     armature = o.data
     pose = o.pose
     not_in_map={}
@@ -51,31 +56,21 @@ def import_motion_key(l, o):
         keyFrames=l.getBoneKeyFrameList(n)
         boneName=englishmap.getEnglishBoneName(n)
         try:
-            poseBone=pose.bones[boneName]
             bone=armature.bones[boneName]
             # rot
             armRotate=bone.matrix_local.rotation_part()
             # quat
             armRotateQuaternion=armRotate.to_quat()
-            if armRotateQuaternion.w<0:
-                armRotateQuaternion.w=-armRotateQuaternion.w
-                armRotateQuaternion.x=-armRotateQuaternion.x
-                armRotateQuaternion.y=-armRotateQuaternion.y
-                armRotateQuaternion.z=-armRotateQuaternion.z
 
             # inv
             armRotateInv=mathutils.Matrix(armRotate).transpose()
             # quat
             armRotateInvQuaternion=armRotateInv.to_quat()
-            if armRotateInvQuaternion.w<0:
-                armRotateInvQuaternion.w=-armRotateInvQuaternion.w
-                armRotateInvQuaternion.x=-armRotateInvQuaternion.x
-                armRotateInvQuaternion.y=-armRotateInvQuaternion.y
-                armRotateInvQuaternion.z=-armRotateInvQuaternion.z
 
             reverseFlag=False
             lastQ=None
 
+            poseBone=pose.bones[boneName]
             for i in range(len(keyFrames.list)):
                 key=keyFrames.getKey(i)
                 ####################
@@ -88,12 +83,14 @@ def import_motion_key(l, o):
                 # convert left-handed y-up to right-handed z-up
                 if reverseFlag:
                     # reverse quaternion for slerp
-                    q=mathutils.Quaternion((0, 0, 0), -key.q.w)
+                    q=mathutils.Quaternion()
+                    q.w=-key.q.w
                     q.x=key.q.x
                     q.y=key.q.z
                     q.z=key.q.y
                 else:
-                    q=mathutils.Quaternion((0, 0, 0), key.q.w)
+                    q=mathutils.Quaternion()
+                    q.w=key.q.w
                     q.x=-key.q.x
                     q.y=-key.q.z
                     q.z=-key.q.y
@@ -109,10 +106,12 @@ def import_motion_key(l, o):
                         (float(key.pos.x), float(key.pos.z), float(key.pos.y)))
 
                 # insert
-                poseBone.keyframe_insert('rotation_quaternion', -1, keyFrames.getFrame(i))
-                poseBone.keyframe_insert('location', -1, keyFrames.getFrame(i))
-                last_frame=max(last_frame, keyFrames.getFrame(i))
+                poseBone.keyframe_insert(
+                        'location', -1, keyFrames.getFrame(i))
+                poseBone.keyframe_insert(
+                        'rotation_quaternion', -1, keyFrames.getFrame(i))
 
+                last_frame=max(last_frame, keyFrames.getFrame(i))
                 counter+=1
 
         except KeyError as msg:
@@ -133,39 +132,39 @@ def IPO_CURVE_get_or_create(ipo, name):
     return ipo.addCurve(name)
 
 
-def import_shape_key(l, mesh):
-    print('import_shape_key: %s' % mesh.name)
-    return 0
-    # ToDo
-    key = mesh.getData().key
-    if key is None:
-        Draw.PupMenu('selecting mesh not has a Key')
-        return
-    # get or create IPO  
-    ipo = key.getIpo()
-    if ipo == None:
-        ipo = Blender.Ipo.New("Key", "ShapeKey")
-        key.ipo = ipo
+def getKey(mesh, name):
+    for shapeKey in mesh.shape_keys.keys:
+        if shapeKey.name==name:
+            return shapeKey
+
+
+def import_shape_key(l, meshObject):
+    print('import_shape_key: %s' % meshObject.name)
 
     # insert shape keys
     counter=0
     last_frame=0
+
     for n in l.morphKeys:
         keyFrames=l.getMorphKeyFrameList(n)
         if n=='base':
             continue
         name=englishmap.getEnglishSkinName(n)
-        try:
-            curve=IPO_CURVE_get_or_create(ipo, name)
-        except NameError as msg:
-            print(NameError, msg)
-            print(n, name)
+        if not name:
+            name=n
+
+        shapeKey=getKey(meshObject.data, name)
+
+        if not shapeKey:
+            print("not found shapeKey: %s" % name)
             continue
-        curve.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
-        for i in xrange(len(keyFrames.list)):
+
+        for i in range(len(keyFrames.list)):
             key=keyFrames.getKey(i)
+            shapeKey.value=key.weight
             frame=keyFrames.getFrame(i)
-            curve[frame]=key.weight
+            shapeKey.keyframe_insert("value", -1, frame)
+
             last_frame=max(last_frame, frame)
 
             counter+=1