Почему матрица, сгенерированная frustumM Android, отличается от матрицы Redbook?

Что-то кажется забавным в том, как работает 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, или я просто что-то упустил? Я знаю, что этот термин отменяется, если усеченная пирамида симметрична. При запуске кода с асимметричной усеченной пирамидойсгенерированные матрицы на самом деле различны, как и результирующие векторы, когда один и тот же вектор умножается на эти разные матрицы.

6
задан Glorfindel 22 August 2019 в 17:16
поделиться