Открыть сервис

Матрица проекции

Матрица проекции — это математический объект, используемый в компьютерной графике, геометрии и линейной алгебре для преобразования трёхмерных координат сцены в двухмерные координаты изображения на экране или другой плоскости проекции. Она задаёт отображение точек из трёхмерного пространства на двумерную проекционную плоскость с учётом параметров камеры (угла обзора, расстояния до ближней и дальней плоскостей отсечения) и типа проекции (перспективная или ортографическая). Матрица проекции является ключевым элементом графического конвейера (pipeline) в системах рендеринга, таких как OpenGL, DirectX и Vulkan.

История

Понятие проекции восходит к античной геометрии (труды Евклида, проективная геометрия XVII века — Ж. Дезарг, Б. Паскаль). Однако в современном виде матрица проекции сформировалась в середине XX века с развитием компьютерной графики. В 1960-х годах Иван Сазерленд в рамках проекта Sketchpad заложил основы трёхмерной графики, включая перспективные преобразования. В 1970-х годах алгоритмы, основанные на матрицах проекции, стали стандартом для первых графических систем (например, в системах CAD). С появлением спецификации OpenGL (1992 год) и DirectX (1995 год) матрица проекции была формализована как часть стандартного графического конвейера, где она используется для преобразования координат из пространства камеры (view space) в пространство отсечения (clip space).

Типы проекций

Перспективная проекция

Перспективная проекция имитирует зрительное восприятие человека: удалённые объекты выглядят меньше, а параллельные линии сходятся в точке схода. Матрица перспективной проекции строится на основе параметров:

  • Поле зрения (FOV, field of view) — угол, под которым камера «видит» сцену (обычно по вертикали или горизонтали).
  • Соотношение сторон (aspect ratio) — отношение ширины к высоте области вывода.
  • Ближняя плоскость отсечения (near plane) — минимальное расстояние от камеры, на котором объекты отображаются.
  • Дальняя плоскость отсечения (far plane) — максимальное расстояние, за которым объекты отсекаются.

Формула матрицы перспективной проекции (в стандартной правой системе координат OpenGL):

\[ P = \begin{pmatrix} \frac{1}{\tan(\text{FOV}/2) \cdot \text{aspect}} & 0 & 0 & 0 \\ 0 & \frac{1}{\tan(\text{FOV}/2)} & 0 & 0 \\ 0 & 0 & -\frac{\text{far} + \text{near}}{\text{far} - \text{near}} & -\frac{2 \cdot \text{far} \cdot \text{near}}{\text{far} - \text{near}} \\ 0 & 0 & -1 & 0 \end{pmatrix} \]

После умножения на матрицу координаты оказываются в однородном пространстве отсечения. Затем выполняется перспективное деление (деление на компоненту \(w\)), что даёт нормализованные координаты устройства (NDC) в диапазоне \([-1, 1]\).

Ортографическая проекция

Ортографическая (параллельная) проекция отображает объекты без учёта перспективы: размеры не зависят от расстояния до камеры, а параллельные линии остаются параллельными. Матрица ортографической проекции задаётся границами видимого объёма (left, right, bottom, top, near, far):

\[ P = \begin{pmatrix} \frac{2}{\text{right} - \text{left}} & 0 & 0 & -\frac{\text{right} + \text{left}}{\text{right} - \text{left}} \\ 0 & \frac{2}{\text{top} - \text{bottom}} & 0 & -\frac{\text{top} + \text{bottom}}{\text{top} - \text{bottom}} \\ 0 & 0 & -\frac{2}{\text{far} - \text{near}} & -\frac{\text{far} + \text{near}}{\text{far} - \text{near}} \\ 0 & 0 & 0 & 1 \end{pmatrix} \]

Ортографическая проекция применяется в технических чертежах, CAD-системах, топографических картах и некоторых играх (например, в изометрических видах).

Математические основы

Матрица проекции является частным случаем матрицы преобразования в однородных координатах. Она умножается на вектор вершины в пространстве камеры (четыре компоненты: \(x, y, z, w\)) и выводит вектор в пространстве отсечения. После перспективного деления (деление на \(w\)) координаты нормализуются. В OpenGL и DirectX используются разные системы координат: в OpenGL NDC — куб \([-1, 1]^3\), в DirectX — диапазон \([0, 1]\) по оси Z.

Матрица проекции не является обратимой в общем случае (потеря информации о глубине при переходе к 2D), но при наличии буфера глубины (z-buffer) сохраняется относительная глубина для сортировки объектов.

Применение

Компьютерная графика и видеоигры

Матрица проекции — обязательный элемент графического конвейера. Она используется в:

  • Рендеринге 3D-сценпреобразование вершин моделей в экранные координаты.
  • Шейдерахпрограммируемые шейдеры (вершинные, геометрические) умножают матрицу проекции на входные координаты.
  • Виртуальной реальности — для каждой линзы (левый/правый глаз) строится своя матрица проекции с учётом искажений.
  • Постобработке — матрица проекции может применяться для эффектов глубины резкости, тумана и тени.

Научная визуализация

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

Робототехника и компьютерное зрение

В задачах калибровки камеры и реконструкции 3D-сцен матрица проекции (также называемая матрицей камеры) связывает координаты точек в пространстве с их проекциями на изображении. Она включает внутренние параметры камеры (фокусное расстояние, оптический центр) и внешние (поворот, сдвиг). Такая матрица используется в алгоритмах SLAM, стереозрении и дополненной реальности.

Реализация в графических API

OpenGL

В OpenGL матрица проекции задаётся через функции gluPerspective() (для перспективной) или glOrtho() (для ортографической), либо вручную через шейдеры. В современных версиях (OpenGL 3.0+) устаревшие функции заменены на передачу матрицы через uniform-переменные в вершинном шейдере.

DirectX

В DirectX матрица проекции создаётся с помощью функций XMMatrixPerspectiveFovLH() (левая система координат) или XMMatrixOrthographicLH(). В DirectX 12 и Vulkan матрица проекции передаётся в виде буфера констант.

Vulkan

Vulkan использует левую систему координат с NDC по оси Z в диапазоне \([0, 1]\). Матрица проекции строится разработчиком вручную или с помощью библиотек (например, GLM).

Критика и ограничения

  • Потеря глубины — при перспективном делении абсолютная глубина теряется, что может вызывать артефакты при z-борьбе (z-fighting) на больших расстояниях.
  • Неравномерное распределение точности — в перспективной проекции точность буфера глубины падает с увеличением расстояния, что требует использования логарифмического z-буфера или реверсивного z-буфера.
  • Зависимость от параметров — неправильный выбор FOV или плоскостей отсечения приводит к искажениям (например, «рыбий глаз» при слишком большом FOV) или отсечению важных объектов.

Интересные факты

  • В ранних 3D-играх (например, Doom, 1993) матрица проекции не использовалась в явном виде — рендеринг выполнялся с помощью алгоритмов, имитирующих перспективу (raycasting).
  • В современных графических процессорах (GPU) умножение на матрицу проекции выполняется аппаратно за один такт для каждой вершины.
  • Матрица проекции может быть комбинирована с матрицей вида (view matrix) и мировой матрицей (model matrix) в единую матрицу MVP (Model-View-Projection).

См. также

  • Однородные координаты
  • Проективная геометрия
  • Буфер глубины
  • Графический конвейер
  • Матрица поворота
  • Матрица сдвига

Источники

  • Foley, J. D., van Dam, A., Feiner, S. K., Hughes, J. F. (1995). Computer Graphics: Principles and Practice (2nd ed.). Addison-Wesley.
  • Shirley, P., Marschner, S. (2009). Fundamentals of Computer Graphics (3rd ed.). CRC Press.
  • OpenGL ARB (1992). The OpenGL Graphics System: A Specification (версии 1.0–4.6).
  • Microsoft (1995). DirectX SDK Documentation.
  • Документация Vulkan 1.3 (2023). Vulkan Specification.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →