From f18a834464091fb68ce2e76abde07032bd63ec87 Mon Sep 17 00:00:00 2001 From: malc Date: Sat, 8 Nov 2008 22:45:36 +0300 Subject: [PATCH] Proper quat12 handing --- anb.ml | 12 ++++++------ reeng/animations.txt | 13 +++++++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/anb.ml b/anb.ml index 3d6f47c..560d45e 100644 --- a/anb.ml +++ b/anb.ml @@ -85,16 +85,16 @@ let quat12 posecount sectbuf sbuf = let madd v n = float v /. 32768.0 *. floats.(n*2 + 1) +. floats.(n*2) in - eprintf "quat12 is dead wrong@."; let toquat poseno = let a = Xff.r16s sbuf16 (poseno*6 + 0) and b = Xff.r16s sbuf16 (poseno*6 + 2) and c = Xff.r16s sbuf16 (poseno*6 + 4) in - let yaw = madd a 0 - and pitch = madd b 1 - and roll = madd c 2 in - (* wrong *) - Qtr.from_euler yaw pitch roll + let sign = a land 1 = 1 in + let i = madd a 0 + and j = madd b 1 + and k = madd c 2 in + let s = sqrt (1.0 -. (i*.i +. j*.j +. k*.k)) in + Qtr.make i j k (if sign then -.s else s) in Array.init posecount toquat ;; diff --git a/reeng/animations.txt b/reeng/animations.txt index 5e43590..89dd05b 100644 --- a/reeng/animations.txt +++ b/reeng/animations.txt @@ -66,13 +66,22 @@ When flag is 3,4,5,6: ---------------------------------------------------------------------- When flag is 12: Data contains: 6 floating point numbers and an array of M 48 bit - values. (Looks as if every 48 bit value is a tuple of three 16 bit - values) + values. Floating pints form 3 pairs, constraint: first pair member (-1, 1) second [ 0, 1) + Each 48 bit value is a tuple of 3 signed 16 bit fields (I,J,K), + quaternion is obtained like this: + + i = madd (I / 32768.0, pairs[0].first, pairs[0].second); + j = madd (J / 32768.0, pairs[1].first, pairs[1].second); + k = madd (K / 32768.0, pairs[2].first, pairs[2].second); + s = sqrt (1 - magnitude (i, j, k)); + if (i & 1) s = -s; + quat q = (i, j, k, s) + ---------------------------------------------------------------------- When flag is 13: Data contains: 5 floating point numbers and an array of M signed 16 -- 2.11.4.GIT