编辑* 我在blender.stackexchange.com上问过这个问题。 https://blender.stackexchange.com/q/58524/27834
我正在使用blender 2.49,因为该脚本最初是为该版本编写的。
我正在尝试使用一些转换数据创建动画。
原始数据包含一系列关节。每个关节都有自己的旋转和平移值,它可能有也可能没有父关节。这听起来很像搅拌机中的骨头,对吗?
设置骨架:
#pseudocode
for joint in joints:
v = Vector(0,0,0)
j=joint
while j:
v = j.rotation*v
v = v + j.location
j = j.parent
joint.position = v
处理某个框架:
#pseudocode
for joint in joints:
v = Vector(0,0,0)
j=joint
while j:
rot=j.rotation+j.curFrame.dRotation
loc=j.location+j.curFrame.dLocation
v = rot*v
v = v + loc
j = j.parent
joint.position = v
为了简单起见,我将每个关节转换成一个小骨头。
for i in range(0, len(bones)):
bone = Blender.Armature.Editbone()
bone.head = Mathutils.Vector(0,0,0)
bone.tail = Mathutils.Vector(0,1,0)
bone.name = 'Bone.' + str(i)
bone.parent = armature.bones['Bone.' + str(bones[i].parent)]
armature.bones[bone.name] = bone
然后我将骨骼移动到他们想要的位置,使用posebone技巧创建骨架:
pose=armObject.getPose()
pose_bones=pose.bones
#pose the bones
for i in range(0, len(bones)):
name = 'Bone.'+str(i)
tran = transforms[i]
pose.bones[name].quat = Mathutils.Euler(tran.rotX,tran.rotY,tran.rotZ).toQuat()
pose.bones[name].loc = Mathutils.Vector(tran.locX, tran.locY, tran.locZ)
pose.update()
#update editbones
armature.makeEditable()
for i in range(0, len(bones)):
name = 'Bone.'+str(i)
armature.bones[name].matrix = pose.bones[name].poseMatrix
armature.update()
#reset pose
for i in range(0, len(bones)):
name = 'Bone.'+str(i)
pose.bones[name].quat = Mathutils.Euler(0,0,0).toQuat()
pose.bones[name].loc = Mathutils.Vector(0,0,0)
pose.update()
到目前为止一切顺利。但是当我将变换应用于某个帧时,结果是不正确的。
for i in range(0, len(bones)):
name = 'Bone.'+str(i)
tran = frame.dTransforms[i]
pose.bones[name].quat = Mathutils.Euler(tran.rotX,tran.rotY,tran.rotZ).toQuat()
pose.bones[name].loc = Mathutils.Vector(tran.locX, tran.locY, tran.locZ)
不正确我的意思是旋转似乎是正确的,但翻译都是错误的。我想这是因为变换应该应用于posebone的局部空间(骨架是正确的,因为所有变换都从中心开始)?但是我该怎么做?