WebGL, gl-матрица. Как получить вершины Frustrum из матрицы камеры и проекции? - PullRequest
1 голос
/ 01 апреля 2019

Я использую библиотеку gl-matrix . Для расчетов по линейной алгебре

У меня есть матрица view и projection, которую я использовал для своей камеры в 3D-движке. view является матрицей вида.

const view =  mat4.lookAt(
    [],
    camera.eye,
    camera.target,
    camera.up
  );

const projection = mat4.perspective(
     [],
     Math.PI / 4,
     viewport.width / viewport.height,
     0.1,
     1000.0
    );

Я хочу получить 8 вершин усеченной камеры из этой настройки камеры для использования в ограничивающей рамке для карты теней.

1 Ответ

1 голос
/ 01 апреля 2019

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

Чтобы получить точки в пространстве вида, точки в нормализованном пространстве устройства должны быть преобразованы матрицей обратной проекции, а затем Перспективное деление .
Точка зрения может быть преобразована в точку в мировом пространстве с помощью матрицы обратного просмотра.

Обратная матрица может быть вычислена с помощью mat4.invert .Код для преобразования точки из нормализованного пространства устройства в мировое пространство может быть следующим:

inv_view = mat4.invert([], view);
inv_proj = mat4.invert([], projection);

ndc_corner = vec4.set([], -1, -1, -1, 1); // (-1, -1, -1) left, bottom, near

view_corner_h = vec4.transformMat4([], ndc_corner, inv_proj);
view_corner = vec4.scale([], view_corner_h, 1/view_corner_h[3]);

world_corner = vec4.transformMat4([], view_corner, inv_view);
...