__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
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
def import_motion_key(l, o):
print('import_motion_key: %s' % o.name)
-
+
+
armature = o.data
pose = o.pose
not_in_map={}
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)
####################
# 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
(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:
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