2015-02-23 28 views
5

I mio programma 3D, la rotazione dell'oggetto è rappresentata dal quaternio come [0.130526, 0.0, 0.0, 0.991445]. Il programma funziona con il sistema di coordinate destrorso con l'asse Z rivolto verso l'alto (come in 3ds max):Converti quaternion da sistema destrorso a sinistrorso

enter image description here

D'altra parte, utilizzare la mia domanda mancino sistema di coordinate e Y asse è fino:

enter image description here

Come posso trasformare il mio quaternion da un sistema di coordinate ad un altro, con il rispetto per il quale asse è in su?

+0

possibile duplicato di [capovolgimento di un quaternione da destra a mancini coordianati] (http://stackoverflow.com/questions/1274936/flipping-a-quaternion-from-right-to-left-handed-coordianates) –

+0

@ PaulR la domanda che hai citato è 5yo, copre metà del mio problema (scambiando gli assi) e non ha ricevuto risposta (oltre a "non puoi" quando la vedo chiaramente funzionare tutti i giorni - alcuni software sono in grado di convertirli per esportare modelli ma io non 'Ho un codice sorgente per questo, purtroppo). – PolGraphic

risposta

8

Una rotazione dell'angolo x attorno all'asse (u, v, w) può essere rappresentata da quaternione con parte reale cos (x/2) e parte irreale sin (x/2) * (u, v, w).

Se le coordinate dell'asse sono (u, v, w) nel trihedron originale, saranno (u, w, v) nel tuo triedro.

Quindi se il quaternione originale era (a, b, c, d) - a + ib + jc + kd - il quaternione deve essere trasformato in (a, b, d, c) nel tuo triedro.

EDIT

Ma perché il tuo trihedron è mancino, l'angolo deve anche essere invertito, in modo dalla stessa rotazione può finalmente essere espresso dal quaternione (a, b, d, c) nel tuo trihedron.

+0

Giusto per confermare: 'a' è l'angolo di rotazione in questo caso, e' b' = 'u',' c' = 'v',' d' = 'w', corretto? – calvin

+1

@calvin a è una parte reale di quaternion = cos (x/2), l'angolo di rotazione è x. b, c, d è una parte irreale di quaternion, uguale alle coordinate dell'asse u, v, w moltiplicate per sin (x/2) –