Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def animate_armature(frame, armature, armatureObj, pose_bones, child, offset=None):
- name = child.name
- pose_bone = pose_bones[name]
- rest_bone = armature.bones[name]
- frame_vals = frame.bones.get(name, Vector())
- offset = offset or Vector(0., 0., 0.)
- rvals = (radians(frame_vals.x), radians(frame_vals.y), radians(frame_vals.z))
- cx, cy, cz = cos(rvals)
- sx, sy, sz = sin(rvals)
- trans_matrix = array([
- [cy*cz, -cx*sz + sx*sy*cz, sx*sz + cx*sy*cz, 0.],
- [cy*sz, cx*cz + sx*sy*sz, -sx*cz + cx*sy*sz, 0.],
- [-sy, sx*cy, cx*cy , 0.],
- [0., 0., 0., 1.],
- ]).T
- offset_matrix = array([
- [1., 0., 0., offset.x],
- [0., 1., 0., offset.y],
- [0., 0., 1., offset.z],
- [0., 0., 0., 1.]
- ])
- trans_matrix = dot(dot(dot(offset_matrix, child.axis_rot), trans_matrix), child.axis_rot_inv)
- mat = asmatrix(trans_matrix)[:3,:3].T.I
- result = toEulerXYZ(array(mat, copy=False))
- mats = [RotationMatrix(degrees(result[0])%360,3,'x'), RotationMatrix(degrees(result[1])%360,3,'y'), RotationMatrix(degrees(result[2])%360,3,'z')]
- bone_rotation_matrix = (mats[2]*(mats[1]* (mats[0]* MATRIX_IDENTITY_3x3))).resize4x4()
- bone_rest_matrix = rest_bone.matrix['ARMATURESPACE'].rotationPart().resize4x4()
- bone_rest_matrix_inv = Matrix(bone_rest_matrix).invert()
- pose_bone.quat = (bone_rest_matrix * bone_rotation_matrix * bone_rest_matrix_inv).toQuat()
- pose_bone.insertKey(armatureObj, frame.number, [Blender.Object.Pose.ROT], True)
- new_offset = Vector([x*child.length for x in child.direction])
- for child in child.children:
- animate_armature(frame, armature, armatureObj, pose_bones, child, new_offset)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement