Trasforma l'ordine di moltiplicazione Matrix


21

Sto riscontrando difficoltà nel cercare di capire l'ordine di moltiplicazione corretto per una matrice di trasformazione finale. Ottengo sempre strani movimenti o geometria distorta. Il mio modello attuale è spiegato di seguito:

Per un singolo nodo il mio ordine di moltiplicazione è:

L = S * R * T

dove

L = matrice di trasformazione locale

S = matrice di scala locale

R = matrice di rotazione locale

T = matrice di traduzione locale

Per la trasformazione mondiale di un nodo:

W = PW * L

dove

W = matrice di trasformazione mondiale

PW = matrice di trasformazione del mondo padre

L = la matrice di trasformazione locale calcolata sopra

Durante il rendering, per ciascun nodo calcolo la matrice:

MV = Inv (C) * NW

dove

MV = la matrice di trasformazione della vista del modello per un nodo particolare

Inv (C) = la matrice di trasformazione inversa della videocamera

NW = la matrice di trasformazione mondiale del nodo calcolata sopra.

Infine, nello shader ho la trasformazione incombente:

TVP = PRP * MV * VP

dove

TVP = posizione del vertice trasformata finale

PRP = matrice prospettica

MV = la matrice di trasformazione mondiale del nodo calcolata sopra

VP = posizione vertice non trasformata.

Con il modello attuale, i nodi figlio con rotazione locale ruotano in modo strano quando si trasforma la telecamera. Dove ho sbagliato nell'ordine di moltiplicazione?

Risposte:


37

Qualsiasi combinazione dell'ordine S*R*Tfornisce una matrice di trasformazione valida. Tuttavia, è abbastanza comune prima ridimensionare l'oggetto, quindi ruotarlo, quindi tradurlo:

L = T * R * S

Se non lo fai in questo ordine, un ridimensionamento non uniforme sarà influenzato dalla rotazione precedente, facendo apparire il tuo oggetto distorto. E la rotazione sarà influenzata dalla traduzione, rendendo la posizione finale del tuo oggetto molto diversa da ciò che il valore della traduzione ti farebbe prevedere.


Puoi spiegarlo un po 'di più? Da quello a cui sono abituato, la rotazione non può essere influenzata da una traduzione poiché è una differenza di orientamento tra due fotogrammi, indipendentemente dalla posizione. Invece, una traduzione può essere influenzata da una rotazione che si verifica prima di essa, poiché si tradurrà sull'asse di rotazione appena definito. In L = TRS, la traduzione avviene per prima, quindi non è influenzata dai nuovi vettori creati dalla rotazione.
user-2147482637

4
La confusione deriva dal fatto che stai parlando di trasformazioni locali (in cui la cornice rimane collegata all'oggetto), mentre le trasformazioni qui descritte avvengono nello spazio del mondo (dove esiste solo una cornice di riferimento fissa, il mondo). Concettualmente, il tuo modo di vedere le cose è valido ed equivale ad applicare le trasformazioni in ordine inverso.
sam hocevar,
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.