diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-12 20:04:00 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-12 20:04:00 +0400 |
commit | 25b31e5b7d911d57996042a10f9e3cf645d07b93 (patch) | |
tree | 6c2db98105ac772abec1df0e60931185a3a95760 /io_anim_bvh/export_bvh.py | |
parent | ba4b4635e7646999a02ea2e837a9371d379508f5 (diff) |
maintain order from import to export (secondlife expects bone order to be maintained).
also use less confusing bone rotation matrix -> euler conversion on export.
Diffstat (limited to 'io_anim_bvh/export_bvh.py')
-rw-r--r-- | io_anim_bvh/export_bvh.py | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/io_anim_bvh/export_bvh.py b/io_anim_bvh/export_bvh.py index 977c36f5..fcddb63c 100644 --- a/io_anim_bvh/export_bvh.py +++ b/io_anim_bvh/export_bvh.py @@ -54,13 +54,11 @@ def write_armature(context, for bone in arm.bones: children[bone.name] = [] + # keep bone order from armature, no sorting, not esspential but means + # we can maintain order from import -> export which secondlife incorrectly expects. for bone in arm.bones: children[getattr(bone.parent, "name", None)].append(bone.name) - # sort the children - for children_list in children.values(): - children_list.sort() - # bone name list in the order that the bones are written serialized_names = [] @@ -157,7 +155,8 @@ def write_armature(context, "skip_position", # is the bone disconnected to the parent bone? "rot_order", "rot_order_str", - ) + "rot_order_str_reverse", # needed for the euler order when converting from a matrix + ) _eul_order_lookup = { 'XYZ': (0, 1, 2), @@ -177,6 +176,7 @@ def write_armature(context, self.rot_order_str = ensure_rot_order(self.pose_bone.rotation_mode) else: self.rot_order_str = rotate_mode + self.rot_order_str_reverse = self.rot_order_str[::-1] self.rot_order = DecoratedBone._eul_order_lookup[self.rot_order_str] @@ -192,7 +192,7 @@ def write_armature(context, self.rest_local_imat = self.rest_local_mat.inverted() self.parent = None - self.prev_euler = Euler((0.0, 0.0, 0.0), self.rot_order_str) + self.prev_euler = Euler((0.0, 0.0, 0.0), self.rot_order_str_reverse) self.skip_position = ((self.rest_bone.use_connect or root_transform_only) and self.rest_bone.parent) def update_posedata(self): @@ -246,12 +246,12 @@ def write_armature(context, loc = mat_final.to_translation() + dbone.rest_bone.head # keep eulers compatible, no jumping on interpolation. - rot = mat_final.to_3x3().inverted().to_euler(dbone.rot_order_str, dbone.prev_euler) + rot = mat_final.to_euler(dbone.rot_order_str_reverse, dbone.prev_euler) if not dbone.skip_position: file.write("%.6f %.6f %.6f " % (loc * global_scale)[:]) - file.write("%.6f %.6f %.6f " % (-degrees(rot[dbone.rot_order[0]]), -degrees(rot[dbone.rot_order[1]]), -degrees(rot[dbone.rot_order[2]]))) + file.write("%.6f %.6f %.6f " % (degrees(rot[dbone.rot_order[0]]), degrees(rot[dbone.rot_order[1]]), degrees(rot[dbone.rot_order[2]]))) dbone.prev_euler = rot |