From d02a6b5de7aec3ea50a96445d1d4436a7874a63f Mon Sep 17 00:00:00 2001 From: Julien Duroure Date: Fri, 1 Feb 2019 19:38:00 +0100 Subject: [PATCH] Fix #254 fix some antipodal quaternion issue for bones --- .../blender/imp/gltf2_blender_animation_bone.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/io_scene_gltf2/blender/imp/gltf2_blender_animation_bone.py b/addons/io_scene_gltf2/blender/imp/gltf2_blender_animation_bone.py index 788fbc40e..2d835c540 100644 --- a/addons/io_scene_gltf2/blender/imp/gltf2_blender_animation_bone.py +++ b/addons/io_scene_gltf2/blender/imp/gltf2_blender_animation_bone.py @@ -110,12 +110,20 @@ def parse_rotation_channel(gltf, node, obj, bone, channel, animation): if animation.samplers[channel.sampler].interpolation == "CUBICSPLINE": # TODO manage tangent? - quat_keyframes = ( + quat_keyframes = [ quaternion_gltf_to_blender(values[idx * 3 + 1]) for idx in range(0, len(keys)) - ) + ] else: - quat_keyframes = (quaternion_gltf_to_blender(vals) for vals in values) + quat_keyframes = [quaternion_gltf_to_blender(vals) for vals in values] + + # Manage antipodal quaternions + # (but is not suffisant, we also convert quaternion --> euler --> quaternion) + for i in range(1, len(quat_keyframes)): + if quat_keyframes[i].dot(quat_keyframes[i-1]) < 0: + quat_keyframes[i] = -quat_keyframes[i] + + if not node.parent: if bpy.app.version < (2, 80, 0): final_rots = [