Render and graphic
May 28

Координатные системы в графике

Координатные системы и матричные преобразования — основа всего пайплайна.

1. Координатные системы


Каждый объект в 3D проходит через несколько систем координат прежде чем попасть на экран. Вот этот путь:


1.1 Локальная (Model / Object Space)
• Это система координат самого объекта.
• В ней объект "родился". Например, куб — от (-1, -1, -1) до (1, 1, 1).
• Все вершины записываются относительно центра объекта (его pivot).


1.2 Мировая (World Space)
• Объекты размещаются в одной общей 3D-сцене.
• Используется трансформация Model Matrix (или Model-to-World): позиция, поворот, масштаб объекта.
• Например, если ты положишь куб на стол, то ты задаёшь его позицию в мировой системе координат.


1.3 Камера (View / Eye Space)
• Это система координат, в которой камера — в центре координат.
• Все объекты пересчитываются так, как будто ты на них смотришь: поворачиваются и сдвигаются согласно положению камеры.
• Используется View Matrix — обратная трансформация от позиции камеры (т.е. inverse(cameraTransform)).


1.4 Клиповое пространство (Clip Space)
• После применения проекционной матрицы (Perspective или Orthographic).
• Вершины находятся в диапазоне [-w, w] по каждой оси.
• Используется Projection Matrix.
• На этом этапе делается кульбек culling (отсечение внекадровых объектов по фрустуму).


1.5 NDC (Normalized Device Coordinates)
• После деления на w (т.н. perspective divide).
• Координаты нормализованы в диапазон [-1, 1] по каждой оси.
• Всё за пределами — невидимо.


1.6 Экранная система координат (Screen Space)
• Преобразование в пиксели: (0, 0) — нижний левый угол (в OpenGL) или верхний левый (в DirectX).
• Используется Viewport transform.


2. Матричные преобразования (Model, View, Projection)


Model Matrix
• Преобразует координаты из локальных в мировые.
• Включает: Translation * Rotation * Scale


View Matrix
• Переводит мировые координаты в систему координат камеры.
• Задает позицию и ориентацию камеры в сцене.
• Это inverse(cameraModelMatrix)


Projection Matrix
• Преобразует координаты из камерной системы в клиповое пространство.
• Варианты:
• Perspective: ближе — больше, дальше — меньше. Как мы видим в реальности.
• Orthographic: размер не меняется с расстоянием.


Общий путь трансформаций
vertexLocalPos → ModelMatrix → WorldPos → ViewMatrix → ViewSpacePos → ProjectionMatrix → ClipPos → Perspective divide (делим на w) → NDC → Viewport transform → Screen Space

1. Что такое матрица в данном контексте?


Да, матрица — это как двумерный массив чисел, например:
[ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]
В 3D-графике мы почти всегда используем 4x4 матрицы. Они нужны для того, чтобы применять сразу несколько трансформаций к точке (позиции объекта) — позиция, масштаб, поворот, сдвиг.


Зачем 4 строки и 4 столбца?
• 3D-позиция — это 3 значения: (x, y, z), но мы добавляем ещё один параметр — w.
• Это называется однородными координатами, и они позволяют обрабатывать перспективу и сдвиги в одной матрице.


2. Что такое трансформация и обратная трансформация?


Трансформация — это изменение положения, масштаба или ориентации объекта.
Например:
• Переместить куб вправо на 3 метра — это трансформация.
• Повернуть его на 90° — это трансформация.
Трансформации выражаются матрицами.
Когда ты применяешь матрицу к вектору (позиции), ты получаешь новый вектор — объект двигается, вращается или масштабируется.


Обратная трансформация — это отмена предыдущей.
Пример:
• Ты повернул куб на +90°.
• Обратная трансформация повернёт его на -90°, вернув на место.
View Matrix — это обратная трансформация камеры. Вместо того, чтобы двигать "глаз", ты двигаешь весь мир наоборот.


3. Что такое w и зачем он при перспективе и ортографии?


w — это четвёртая компонента вектора в 3D-графике, т.е. (x, y, z, w).


Зачем нужен w?
• Он позволяет выразить перспективу через перспективное деление: x' = x / w y' = y / w z' = z / w — Это даёт эффект "дальше — меньше", без сложной математики в шейдере.
В перспективной проекции
• w = расстояние от камеры.
• Чем дальше объект, тем больше w, тем меньше становятся координаты — создаётся эффект перспективы.
В ортографической проекции
• w просто = 1. Деление на него ничего не меняет. Размер объекта не зависит от расстояния.


4. Что такое "кульбек кулинг" (на самом деле — frustum culling)?


Похоже, ты имел в виду frustum culling — отсечение объектов вне поля зрения камеры.
Frustum — это пирамида усечённого вида (см. ниже), которая задаёт область видимости камеры.
Culling — "отсечение". GPU или движок не рендерит объекты, которые точно не попадут в кадр, чтобы сэкономить ресурсы.


5. Что такое фруструм (frustum)?


Frustum (усечённая пирамида) — это область видимости камеры.
Выглядит как пирамида без вершины:
• Основание (far plane) — это "экран", куда проецируются дальние объекты.
• Вершина (near plane) — ближняя граница.
• Всё, что внутри этого объёма, будет видно на экране.


6. Clip Space vs NDC — это одно и то же?


Почти, но не совсем:
• Clip Space — после Projection Matrix, до деления на w. Координаты еще не нормализованы, находятся в диапазоне [-w, w].
• NDC (Normalized Device Coordinates) — результат деления на w. Диапазон теперь [-1, 1].


Зачем два этапа?
• Clip Space — нужен для отсечения фруструмом (Frustum Culling).
• NDC — нужен, чтобы перевести 3D-координаты в единообразную систему, удобную для перехода к экранным пикселям.


7. Что такое Viewport Transform?


Это последний шаг перед экраном.


Он:
• Переводит координаты из NDC в реальные пиксели экрана.
• Например:
• (-1, -1) → (0, 0) — левый нижний угол.
• (1, 1) → (width, height) — правый верхний угол.
Вот формула:
screenX = ((NDC.x + 1) / 2) * viewportWidth screenY = ((NDC.y + 1) / 2) * viewportHeight

1) Как работает матрица? Что с ней делать? Как она трансформирует?


В контексте 3D-графики матрица — это способ "упаковать" сразу несколько операций над векторами (точками или направлениями) в одну структуру, которую можно применять одним действием — умножением.


Вектор
Обычная позиция в 3D:
vec = [x, y, z]


Для работы с матрицами мы расширяем её до 4D — однородные координаты:
vec = [x, y, z, 1] ← последняя 1 нужна для работы с перемещением


Матрица 4x4 (пример)
[ a, b, c, d ] [ e, f, g, h ] [ i, j, k, l ] [ m, n, o, p ]


Когда ты умножаешь вектор на матрицу, получается новый вектор:
x' = a*x + b*y + c*z + d*1 y' = e*x + f*y + g*z + h*1 z' = i*x + j*y + k*z + l*1 w' = m*x + n*y + o*z + p*1


Что может сделать матрица?
• Масштаб:
[ Sx, 0, 0, 0 ] [ 0, Sy, 0, 0 ] [ 0, 0, Sz, 0 ] [ 0, 0, 0, 1 ]
• Поворот (например, вокруг Z-оси):
[ cos(a), -sin(a), 0, 0 ] [ sin(a), cos(a), 0, 0 ] [ 0, 0, 1, 0 ] [ 0, 0, 0, 1 ]
• Смещение (позиция):
[ 1, 0, 0, Tx ] [ 0, 1, 0, Ty ] [ 0, 0, 1, Tz ] [ 0, 0, 0, 1 ]


А теперь внимание: Все эти операции можно объединить в одну матрицу и применить одним действием. Это и есть трансформация.


Порядок важен!
Масштаб → поворот → позиция = одна матрица, но порядок имеет значение.


В Unity, например, используется M = T * R * S


2) Что такое w? Это просто расстояние от камеры?


Не совсем. Давай разложу:
w — это четвёртая координата вектора
В векторе [x, y, z, w] — это служебная компонента, и она не равна напрямую расстоянию, но поведение w при проецировании отражает удалённость от камеры.


Зачем нужен w?
Чтобы правильно отображать перспективу.
Пример:
При перспективной проекции матрица проецирования устроена так, что:
• Чем дальше объект (z больше), тем больше получается w.
• А потом происходит perspective divide: x' = x / w y' = y / w z' = z / w
— Чем больше w, тем меньше x и y → объекты визуально уменьшаются с расстоянием. Это и есть перспектива.
В ортографической проекции:
• w просто = 1.
• Никакой перспективы нет. Все объекты одинакового размера вне зависимости от z.


Пример на пальцах
Пусть у нас две точки:
• A: [1, 1, 1, 1]
• B: [1, 1, 10, 10]
После деления на w:
• A' = [1, 1, 1]
• B' = [0.1, 0.1, 1] — точка визуально "сжалась" ближе к центру экрана.