2012-07-28 4 views
6

Qualcosa sembra divertente sul modo in cui funziona il frustumM di Android. Se posso controllare il libro rosso OpenGL, la matrice generata si presenta così:
http://www.glprogramming.com/red/images/Image23.gif
Songho.ca sembra essere d'accordo con questo:
http://www.songho.ca/opengl/files/gl_projectionmatrix_eq16.png
Perché la matrice generata dal frustumM di Android differisce da quella del Redbook?

Tuttavia, un componente è moltiplicato per 2 con frustumM di Android, e non negli altri esempi di matrici. Ecco cosa sembra fare:

Tutto sembra corrispondere funzionalmente up, tranne della prima riga, terza colonna. Perché viene moltiplicato per due? Ecco le linee di codice dal metodo di frustumM android.opengl.Matrix che generano i primi tre elementi della terza colonna:

final float A = 2.0f * ((right + left) * r_width); 
final float B = (top + bottom) * r_height; 
final float C = (far + near) * r_depth; 

Con r_width, r_height, r_depth definito come:

final float r_width = 1.0f/(right - left); 
final float r_height = 1.0f/(top - bottom); 
final float r_depth = 1.0f/(near - far); 

La linea di partenza con "flottante finale A" sembra erroneamente moltiplicare per 2.

Si tratta di un errore nel codice di Android o mi manca qualcosa? So che il termine cancella se il tronco è simmetrico. Quando si esegue il codice con un troncone asimmetrico, le matrici generate in realtà sono diverse e lo sono anche i vettori risultanti quando lo stesso vettore viene moltiplicato con quelle matrici differenti.

risposta

1

((mi piacerebbe preffer solo commentare, ma non mi è permesso.))

Grazie ragazzi per l'intuizione. Ho solo dovuto aggiungere

mMyMatrix[8] /= 2f; 

dopo

Matrix.frustrumM(mMyMatrix, ...)

di risolvere i miei problemi di proporzioni :)

1

sì, se si chiama la funzione con un (-ratio, il rapporto, - 1, 1, 1, 10) impostati, non causa il problema, ma se si chiama con (right! = -1 * left), rende la cosa diversa.

Trovo questo problema quando controllo il codice sorgente. sospiro.

Problemi correlati