Quaternioni e rotazione attorno all'asse mondiale


11

Disclaimer: sono un programmatore di giochi professionale e uso i quaternioni quasi tutti i giorni ma sono vicini alla magia nera per me. Sono relativamente a mio agio con la matematica, ma i numeri immaginari mi hanno sempre confuso. Tendo a trattare i quat come utili e finisco per invertire le moltiplicazioni più di una volta. Provo a ragionare su di loro come farei con le matrici con scarso successo.

Comunque....

Ciò che mi sconcerta è il seguente. Quando voglio ruotare un oggetto attorno al suo asse locale, moltiplico la sua rotazione con il quaternione che rappresenta la rotazione che voglio applicare. È quindi una rotazione nello spazio locale.

Ora, se voglio ruotarlo attorno ad un asse nello spazio del mondo, il mio ragionamento sarebbe: prendere la rotazione nello spazio del mondo come quaternione. Moltiplica l'inverso della rotazione del mio oggetto con questo quaternione. Questo porterà la mia rotazione del mondo nello spazio locale. Moltiplica la mia rotazione con questo nuovo quaternione. cioè: newRot = oldRot * (inverso oldRot * worldRot)

Tuttavia, ciò che devo fare è newRot = oldRot * (inversa oldRot * worldRot) * oldRot.

Perché, dopo aver moltiplicato con il quat inverso, devo ancora moltiplicare con il mio quat prima di applicarlo? So che deve esserci una ragione valida e perfetta, ma non riesco a ragionare per uscirne ed è frustrante come diamine. Ho provato le varie domande frequenti e quant'altro, ma la maggior parte va in profondità in matematica, rendendomi meno chiaro.

Qualcuno che può spiegarmelo come se avessi 5 anni?


Non è un po 'come le traduzioni e le rotte della matrice (cioè devi spostare il tuo oggetto al centro, ruotare e poi tornare indietro quando vuoi ruotare un oggetto attorno a sé: Minv_transl * Mrot * Mtransl)
Valmond

I try to reason about them like I would with matrices- allora sei sulla strada giusta. Se hai capito come ruotare attorno agli assi dell'oggetto e agli assi del mondo usando le matrici, puoi fare lo stesso usando i quaternioni. L'ordine di moltiplicazione è lo stesso per matrici e quaternioni.
Maik Semder,

Risposte:


11

I quaternioni sono associativi:

dici che la tua soluzione è:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

che è lo stesso di:

newRot = oldRot * inverse oldRot * worldRot * oldRot

che è lo stesso di:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

che in realtà ti riporta a ciò che sta realmente accadendo:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

L'ordine di applicazione sta cambiando, tutto qui. Tornando alle matrici, quando applichi una matrice di oggetti a una matrice di trasformazione e la memorizzi come nuova matrice di oggetti, questa è la trasformazione dello spazio locale. Quando applichi la matrice di trasformazione alla matrice di oggetti e la memorizzi, questa è la trasformazione del mondo. Riguarda l'ordine di applicazione e niente di più.


1
+1 per la prima parte, la seconda parte è un po 'fuorviante. Se si usasse 'rot' solo nell'ultimo esempio di codice, anziché 'localRot' e 'worldRot', l'esempio diventa più chiaro. In caso contrario, implica che i segni stessi siano comunque diversi . Ma la differenza sta solo nell'ordine di moltiplicazione, come hai mostrato, piuttosto che nei diversi quaternioni ("localRot" e "worldRot"). 'localTransformed' e 'worldTransformed' sarebbe meglio come: 'rotatedAroundLocalAxis' e 'rotatedAroundWorldAxis'. Ciò stesso spiegherebbe le equazioni e renderebbe obsoleto l'ultimo paragrafo, che presenta alcuni difetti.
Maik Semder,

Difetti nell'ultimo paragrafo: la distinzione tra matrice e trasformazione (entrambi sono gli stessi qui e intercambiabili, quindi è meglio usare solo matrice per evitare confusione) e i termini "trasformazione dello spazio locale" e "trasformazione del mondo": sarebbe più giusto dire, la prima equazione ti dà la "matrice da locale a mondo" dopo essere stata ruotata attorno all'asse locale dell'oggetto, la seconda ti dà la "matrice da locale a mondo" dopo essere stata ruotata attorno all'asse del mondo. In entrambi i casi, ciò che ottieni è semplicemente la "matrice da locale a mondo". Tuttavia, la prima parte ha comunque il mio +1 per l'analisi.
Maik Semder,

+1 @Maik potresti forse scrivere una risposta separata per rendere ancora più chiara l'indifferenza tra le rotazioni e la questione dell'ordine di moltiplicazione? Grazie per il commento in entrambi i casi!
Max Dohme,

Ah, ora ha senso. Non sapevo (ahi, che sarebbe stato nelle FAQ) che la moltiplicazione del quaternione fosse associativa, quindi in effetti la rotazione e la sua inversa si annullano a vicenda, dandomi l'intuizione di cui avevo bisogno, una ha la rotazione locale sulla destra e una sulla a sinistra, che in pratica dice "applica rotazione nello spazio padre" o "applica rotazione nello spazio locale" .... non diverso dalle matrici. Abbastanza elementare una volta che lo vedi! Grazie!
Kaj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.