Come ottenere la traduzione dalla matrice di visualizzazione


11

Come posso recuperare la posizione dello spazio mondiale della telecamera dalla sua matrice di visualizzazione? Le uniche risposte che ho visto a questa domanda suggeriscono che la traduzione è nell'ultima riga / colonna ma questo non funzionerebbe poiché la matrice contiene [x (punto) a destra, y (punto) in alto, aspetto z (punto)]

Risposte:


10

Risposta breve

Innanzitutto inverti la matrice di visualizzazione. Quindi recupera la traduzione dall'ultima riga / colonna.

Risposta lunga

Un modo per dedurre il contenuto di una matrice di visualizzazione è iniziare considerando la telecamera come qualsiasi altro oggetto al mondo e calcolando una matrice mondiale per essa:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Una matrice mondiale trasforma le coordinate dallo spazio locale allo spazio mondiale. Ma in questo caso, lo spazio locale della telecamera e lo spazio della vista sono la stessa cosa, quindi possiamo anche dire che questa matrice trasforma le coordinate dallo spazio della vista allo spazio del mondo.

Poiché abbiamo bisogno di una conversione nella direzione opposta , dobbiamo invertire la matrice. Il risultato è ciò che chiamiamo la matrice di visualizzazione che trasforma le coordinate dallo spazio mondiale a quello spaziale:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

E questo è il tipo di matrice che hai. Quindi, al fine di ottenere indietro la posizione della telecamera, sarà prima necessario invertirla, quindi è possibile afferrare la traduzione dall'ultima riga (o colonna a seconda del sistema).


1
Perché invertire prima la matrice? Se (si spera) sai se sei nella riga maggiore o nella colonna maggiore, la posizione del vettore di traduzione dovrebbe essere ovvia.
3Dave il

7

Prima di tutto consiglio vivamente di salvare la posizione come vettore separatamente, renderà le cose molto più facili dal punto di vista computazionale. In ogni modo ...

[x (dot) right, y (dot) up, z (dot) look]non è la matrice di visualizzazione effettiva. La matrice stessa ha la forma:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

dove la matrice 3x3 in alto a sinistra rappresenta rotazioni, scala, ecc. Tutto l'orientamento della telecamera viene fatto lì. La riga e la colonna rimanenti vengono utilizzate per la traduzione e alcune altre complicate cose in prospettiva che non ho intenzione di approfondire al momento.

Quando ottieni la matrice (supponendo che sia una matrice 4x4), la traduzione sarà sempre memorizzata nell'ultima riga o nell'ultima colonna, a seconda che la tua classe di matrice sia un ordinamento riga maggiore o colonna maggiore.

Ciò di cui probabilmente ti stai confondendo è il fatto che hai bisogno dei prodotti punto. Quello che sta succedendo è la semplificazione della matematica della matrice, ci sono risposte più dettagliate in questa domanda Stack Overflow: /programming/349050/calculating-a-lookat-matrix

La soluzione può essere trovata qui , è necessario prendere l'inverso della matrice e ottenere la traduzione di quello:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

Altre risposte qui spiegano come ottenere la posizione della telecamera dall'inverso della matrice della telecamera.

Se la parte 3x3 della matrice della videocamera ha solo la rotazione (nessun ridimensionamento o taglio) come avviene di solito, il calcolo può essere ottimizzato moltiplicando la traduzione della matrice della videocamera con il recepimento della rotazione della videocamera. La posizione della telecamera è quindi il vettore di traduzione trasformato moltiplicato per -1. In GLSL questo è:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

o

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

Questo è quello che ho usato nei miei shader di vertici se non volevo calcolare e passare la posizione della telecamera come uniforme.

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.