Coś wydaje się zabawne w sposobie działania frustumM Androida. Gdybym sprawdzić czerwona książka OpenGL, matryca generowane wygląda następująco:
http://www.glprogramming.com/red/images/Image23.gif
Songho.ca wydaje się zgodzić z tym:
http://www.songho.ca/opengl/files/gl_projectionmatrix_eq16.png
Dlaczego matryca wygenerowana przez system plików cookie na Androida różni się od Redbooki?
Jednak jeden składnik jest mnożona przez 2 z Android frustumM i nie w innych przykładowych matrycach. Oto, co wydaje się robić:
Wszystko wydaje się funkcjonalnie dopasować, wyjątkiem pierwszym wierszu trzeciej kolumnie. Dlaczego jest to pomnożone przez dwa? Poniżej linii kodu z metodą frustumM android.opengl.Matrix że generują pierwsze trzy elementy trzeciej kolumny:
final float A = 2.0f * ((right + left) * r_width);
final float B = (top + bottom) * r_height;
final float C = (far + near) * r_depth;
z r_width, r_height, r_depth zdefiniowany jako:
final float r_width = 1.0f/(right - left);
final float r_height = 1.0f/(top - bottom);
final float r_depth = 1.0f/(near - far);
początkową linię z "ostatecznym floatem A" wydaje się pomyłkowo mnożyć przez 2.
Czy to błąd w kodzie Androida, czy też coś mi brakuje? Wiem, że termin ten znika, jeśli stożek ścięty jest symetryczny. Podczas wykonywania kodu z asymetrycznym stożkiem ściętym generowane macierze są rzeczywiście różne, podobnie jak powstałe wektory, gdy ten sam wektor jest mnożony przez te różne macierze.