Как да изчислим правилно ортографска проекционна матрица?

Попаднах на много различни формули как да изградя проекционната матрица, всички от които дават различни резултати, но имам чувството, че разбирам погрешно концепцията. В момента имам това:

//x = 10 | y = 10 | width = 800 | height = 600
        float left = x;
        float top = y;
        float right = x + width;
        float bottom = y + height;

        final Matrix4f pMatrix = new Matrix4f();
        pMatrix.m[0][0] = 2f / (right - left);
        pMatrix.m[1][1] = 2f / (top - bottom);
        pMatrix.m[2][2] = -2f / (farZ - nearZ);
        pMatrix.m[3][0] = -(right + left) / (right - left);
        pMatrix.m[3][1] = -(top + bottom) / (top - bottom);
        pMatrix.m[3][2] = -(farZ + nearZ) / (farZ - nearZ);
        pMatrix.m[3][3] = 1;

С дадения изход:

0.0025, 0.0, 0.0, -1.025
0.0, -0.0033333334, 0.0, 1.0333333
0.0, 0.0, -0.0068965517, -2.724138
0.0, 0.0, 0.0, 1.0

Въпреки това не съм сигурен дали константите right и bottom са x + ширина & y + височина или просто ширина & височина? В някои статии в мрежата хората използват различни формули, като използват и двете.


person MircoProgram    schedule 12.02.2016    source източник
comment
Това изглежда правилно, но можете да проверите отново този страхотен урок. Използвате ли OpenGL или DirectX? (Прави незначителна разлика в Z компонента).   -  person Andrew Williamson    schedule 12.02.2016


Отговори (1)


Отдясно и отдолу, в това изчисление, трябва да са абсолютни - тоест right = x + width. Изчислението ви изглежда правилно. Основният намек са редове като този:

pMatrix.m[0][0] = 2f / (right - left);

Компонентът x се мащабира според ширината на екрана. Сега, с текущата ви настройка, right - left е същото като (x + width) - x. Това определено ще даде width. Ако вместо това сте използвали right = width, изчислението ще стане width - x, което няма много смисъл.

person Andrew Williamson    schedule 12.02.2016