From ed89e246d9baad2637db487abd3e279a8e6b751d Mon Sep 17 00:00:00 2001 From: Xiang Mochu <33808308+XiangMochu@users.noreply.github.com> Date: Wed, 21 Jan 2026 15:43:07 +0800 Subject: [PATCH] Fix: Handle quaternion flipping and normalization in sample_track --- GLTFextract.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/GLTFextract.py b/GLTFextract.py index dc75f45..3b0e82d 100644 --- a/GLTFextract.py +++ b/GLTFextract.py @@ -296,11 +296,19 @@ def sample_track(track, tsec, default): if T[i] <= tsec <= T[i+1]: a = _clamp((tsec - T[i])/(T[i+1]-T[i]), 0.0, 1.0) A, B = V[i], V[i+1] - if len(A) == 4: # quaternion (simple lerp; good enough here) - return ( (1-a)*A[0]+a*B[0], - (1-a)*A[1]+a*B[1], - (1-a)*A[2]+a*B[2], - (1-a)*A[3]+a*B[3] ) + # if len(A) == 4: # quaternion (simple lerp; good enough here) + # return ( (1-a)*A[0]+a*B[0], + # (1-a)*A[1]+a*B[1], + # (1-a)*A[2]+a*B[2], + # (1-a)*A[3]+a*B[3] ) + + if len(A) == 4: # NLERP instead of LERP + dot = sum(a * b for a, b in zip(A, B)) + B_adj = B if dot >= 0 else [-x for x in B] + res = [(1-a)* A[k] + a*B_adj[k] for k in range(4)] + mag = sum(x*x for x in res)**0.5 + return tuple(x/mag for x in res) + return tuple( (1-a)*A[k] + a*B[k] for k in range(len(A)) ) return default