Domanda

Sto lavorando su 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 fotocamera calibrata in una matrice modelview ed una matrice di proiezione, ma ho incontrato un fenomeno interessante in opengl che sfida spiegazione (almeno da me).

La descrizione breve è che vanificando i risultati della matrice proiezione in nulla viene reso (almeno nella mia esperienza). Mi aspetto che moltiplicando la matrice di proiezione da un qualsiasi scalare avrebbe alcun effetto, perché trasforma coordinate omogenee, che sono influenzati da scalare.

Di seguito è il mio ragionamento perché trovo che questo sia inaspettato; forse qualcuno può precisare dove il mio ragionamento è viziato.

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 questo per coordinate telecamera produce coordinate del clip omogenea:

[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 da 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 del clip risultanti devono essere negata, ma poiché sono coordinate omogenee, moltiplicando per ogni scalare (ad esempio -1) non dovrebbe avere alcun effetto sulle risultanti coordinate normalizzate dispositivo. Tuttavia, in OpenGL, vanificando i risultati P a nulla viene eseguito il rendering. Posso moltiplicare P da un qualsiasi scalare non negativo e ottenere lo stesso risultato rese, ma appena Moltiplico per uno scalare negativo, nulla intonaci. Che cosa sta succedendo qui ??

Grazie!

È stato utile?

Soluzione

Bene, l'essenza di esso è che i test di ritaglio viene fatto attraverso:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

moltiplicando per un negativo pause di valore questo test.

Altri suggerimenti

Ho appena trovato questo bocconcino, il che rende il progresso verso una risposta:

Da Libro rosso, appendice G:

  

Evitare di utilizzare negativo w le coordinate dei vertici e negativi coordinate q texture. OpenGL potrebbe non fermare tali coordinate correttamente e potrebbe rendere errori di interpolazione quando ombreggiatura primitive definiti da tali coordinate.

L'inversione della matrice di proiezione causa negativo W clipping coordinate, e apparentemente OpenGL non come questo. Ma qualcuno può spiegare perché opengl non gestisce questo caso?

di riferimento: http://glprogramming.com/red/appendixg.html

Le ragioni mi vengono in mente:

  • Invertendo la matrice di proiezione, le coordinate saranno più all'interno delle zNear e zFar piani del tronco vista (necessariamente maggiore di 0).
  • Per creare coordinate finestre, le coordinate del dispositivo normalizzate sono tradotti / scalata rispetto alla finestra. Quindi, se hai utilizzato uno scalare negativo per le coordinate della clip, le coordinate di periferica normalizzate (ora invertiti) traducono la finestra a finestra coordinate che sono ... fuori della finestra (a sinistra e in basso, se si vuole)

Inoltre, dal momento che lei ha citato utilizzando una matrice di macchina fotografica e che si è invertita la matrice di proiezione, devo chiedere ... a cui matrici sono si applicano ciò che dalla matrice fotocamera? Operante sulla matrice di proiezione salvare vicino / lontano / fovy / aspetto provoca problemi di ogni genere nel buffer di profondità compreso tutto ciò che utilizza z (test di profondità, face culling, ecc).

La sezione OpenGL FAQ sul trasformazioni ha ancora un po ' i dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top