Что-то кажется забавным в том, как работает frustumM в Android. Если я проверю красную книгу OpenGL, сгенерированная матрица будет выглядеть так:
(источник:glprogramming.com)
Songho.ca, кажется, согласен с этим:
(источник:songho.ca)
Однако один компонент умножается на 2 в матрицах frustumM Android, а не в других примерах матриц. Вот что он делает:
Кажется, все функционально совпадает, , кроме первой строки, третьего столбца. Почему это умножается на два? Вот строки кода из метода frustumM android.opengl.Matrix, которые генерируют первые три элемента третьего столбца:
final float A = 2.0f * ((right + left) * r_width);
final float B = (top + bottom) * r_height;
final float C = (far + near) * r_depth;
С r _шириной, r _высотой, r _глубиной, определяемой как:
final float r_width = 1.0f / (right - left);
final float r_height = 1.0f / (top - bottom);
final float r_depth = 1.0f / (near - far);
Строка, начинающаяся с «final float A», кажется, ошибочно умножается на 2.
Это ошибка в коде Android, или я просто что-то упустил? Я знаю, что этот термин отменяется, если усеченная пирамида симметрична. При запуске кода с асимметричной усеченной пирамидойсгенерированные матрицы на самом деле различны, как и результирующие векторы, когда один и тот же вектор умножается на эти разные матрицы.