将旋转和平移应用于骨骼

时间:2016-07-23 12:20:03

标签: python blender

编辑* 我在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的局部空间(骨架是正确的,因为所有变换都从中心开始)?但是我该怎么做?

0 个答案:

没有答案