La mia fotocamera ruota attorno a un punto quando provo a cambiare l'orientamento. Se ruoto la mia macchina fotografica, diciamo, 30 gradi sull'asse Y, invece di guardare la fotocamera di 30 gradi a destra, la fotocamera ruota attorno al punto che stava guardando.Perché la mia fotocamera ruota attorno a un punto con questa matematica?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Ora, dalla mia comprensione, al fine di spostare la telecamera devo muovere il mondo per l'inverso di tale importo. Quindi, se voglio spostare +1 sull'asse Z, traduco il mondo -1 nell'asse Z. Dal momento che sto usando i quaternioni per rappresentare gli orientamenti, io uso l'inverso del quaternio della telecamera (poiché gli orientamenti sono sempre quaternioni di unità, io ottimizzo usando il coniugato invece di calcolare l'inverso) per ruotare il mondo della giusta quantità.
Ecco come convertire un quaternione di una matrice, in cui q è il quaternione invertita:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
Dopodiché, ho impostato la quota di traslazione della matrice:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
Infine Lo moltiplico sullo stack di matrici modello-view, quindi eseguo il rendering di tutti i miei oggetti. Sono abbastanza sicuro che questa matematica sia corretta, ma non produce i risultati che mi aspettavo. Chiaramente i vettori forward e right sono il problema, quindi la mia unica domanda è perché sbagliano e come dovrebbero essere impostati se voglio ottenere i risultati che mi aspetto. Grazie.
MODIFICA: Ho trovato la soluzione da this guy's quaternion camera class. Per prima cosa costruisco una matrice di rotazione come facevo prima, ma poi prendo i vettori di colonna della matrice dalla prima, seconda e terza colonna (rispettivamente xa, ya e za). Poi ho impostato il componente di traslazione della matrice in questo modo:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
quindi la matrice risultante può essere moltiplicato in pila matrice modelview, e funziona perfettamente.
Trasforma la tua soluzione in una soluzione e accettala. Ecco come contrassegniamo le domande risolte da queste parti. Inoltre penso che ti meriti qualche spiegazione su cosa sta succedendo. Scriverò una risposta per questo. – datenwolf