Sto lavorando a un problema di visione del computer che richiede il rendering di un modello 3d utilizzando una fotocamera calibrata. Sto scrivendo una funzione che rompe la matrice calibrata della telecamera in una matrice modelview e una matrice di proiezione, ma mi sono imbattuto in un fenomeno interessante in opengl che sfida la spiegazione (almeno per me).Perché il segno è importante nella matrice di proiezione opengl
La breve descrizione è che se si annulla la matrice di proiezione non viene eseguito alcun rendering (almeno nella mia esperienza). Mi aspetto che moltiplicare la matrice di proiezione con uno scalare non abbia alcun effetto, perché trasforma le coordinate omogenee, che non sono influenzate dal ridimensionamento.
Di seguito è riportato il mio ragionamento per cui ritengo che questo sia inaspettato; forse qualcuno può indicare dove il mio ragionamento è difettoso.
Immaginate la seguente matrice di proiezione prospettica, che dà risultati corretti:
[ a b c 0 ]
P = [ 0 d e 0 ]
[ 0 0 f g ]
[ 0 0 h 0 ]
moltiplicando tale da coordinate telecamera produce fermaglio omogenea coordinate:
[x_c] [ a b c 0 ] [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c] [ 0 0 f g ] [Z_e]
[w_c] [ 0 0 h 0 ] [W_e]
Infine, per ottenere normalizzati coordinate del dispositivo, si divide x_c, y_c e z_c di w_c:
[x_n] [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n] [z_c/w_c]
Ora, se neghiamo P, le coordinate di clip risultanti dovrebbero essere negate, ma poiché sono coordinate omogenee, moltiplicando per qualsiasi scalare (ad es. -1) non dovrebbe avere alcun effetto sulle coordinate del dispositivo normalizzate risultanti. Tuttavia, in openGl, la negazione di P risulta in nulla resa. Posso moltiplicare P per qualsiasi scalare non negativo e ottenere lo stesso risultato di rendering, ma non appena mi si moltiplica per uno scalare negativo, non viene eseguito il rendering. Che cosa sta succedendo qui??
Grazie!
Bella risposta! Supponevo che il test di clipping fosse: -1