Перспективная проекция OpenGL: Как определить левую и правую - PullRequest
1 голос
/ 29 октября 2019

Как мне установить координаты для матрицы перспективы, как в ортографической проекции для левой, правой, верхней и нижней частей, и добавить в поля зрения и соотношение сторон. Я видел только перспективную матрицу, использующую другие аргументы в методе без левого, правого, нижнего, верхнего. Это моя орто-матрица:

public static Matrix4f Orthographic(float left, float right, float bottom, float top, float near, float far) {
        Matrix4f result = Identity();

        result.elements[0 + 0 * 4] = 2.0f / (right - left);

        result.elements[1 + 1 * 4] = 2.0f / (top - bottom);

        result.elements[2 + 2 * 4] = 2.0f / (near - far);

        result.elements[0 + 3 * 4] = (left + right) / (left - right);
        result.elements[1 + 3 * 4] = (bottom + top) / (bottom - top);
        result.elements[2 + 3 * 4] = (far + near) / (far - near);

        return result;
    }

Теперь я хочу создать перспективную с теми же аргументами, но с добавленным fov.

1 Ответ

1 голос
/ 30 октября 2019

В перспективной проекции матрица проекции описывает отображение из трехмерных точек в мире, которые они видят из камеры-обскуры, в двумерные точки видового экрана.
Координаты пространства глаза в усечении камеры (усеченная пирамида)) отображаются в куб (нормализованные координаты устройства).

Область просмотра перспективной проекции может быть определена с помощью 6 расстояний.

На следующих расстояниях left, right, bottom и top - расстояния от центра вида до боковых граней усеченного конуса, наближний самолет. near и far задают расстояния до ближней и дальней плоскостей усеченного конуса.

r = right, l = left, b = bottom, t = top, n = near, f = far

x:    2*n/(r-l)      0              0                0
y:    0              2*n/(t-b)      0                0
z:    (r+l)/(r-l)    (t+b)/(t-b)    -(f+n)/(f-n)    -1
t:    0              0              -2*f*n/(f-n)     0

Если проекция симметрична, где линия визирования является осью симметрии усеченного вида, томатрица может быть упрощена и может быть задана углом поля зрения (fov_y), соотношением сторон (w / h) и двумя расстояниями до ближней и дальней плоскости

a  = w / h
ta = tan( fov_y / 2 );

2 * n / (r-l) = 1 / (ta * a)
2 * n / (t-b) = 1 / ta
(r+l)/(r-l)   = 0
(t+b)/(t-b)   = 0

. Таким образом,Симметрично перспективная проекция:

x:    1/(ta*a)  0      0              0
y:    0         1/ta   0              0
z:    0         0     -(f+n)/(f-n)   -1
t:    0         0     -2*f*n/(f-n)    0
...