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.