Матрица проекции¶
Матрица проекции — это математический объект, используемый в компьютерной графике, геометрии и линейной алгебре для преобразования трёхмерных координат сцены в двухмерные координаты изображения на экране или другой плоскости проекции. Она задаёт отображение точек из трёхмерного пространства на двумерную проекционную плоскость с учётом параметров камеры (угла обзора, расстояния до ближней и дальней плоскостей отсечения) и типа проекции (перспективная или ортографическая). Матрица проекции является ключевым элементом графического конвейера (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 →


