Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

В этой статье вы узнаете:

1.Что такое пространство?

2.О самых распространенных пространствах:

  • World Space
  • Object/Local Space
  • Camera/View Space
  • Tangent Space

3.Причем тут трансформ и умножение матриц?

4.И о том, как их можно использовать на примерах:

  • Шейдер заснеженного камня
  • Паралакс Шейдер

Что понадобится

🧑‍💻 Опыт работы с игровым движком или 3D софтом

📐 Пространственное мышление

☕ Чашечка кая/чофе

Что такое пространство?

Пространство - это координатная система, которая начинается из Точки отсчета/Нулевой координаты/Ориджина/Пивота с направляющими векторами, абсциссой, ординатой и аппликатой, они же X,Y,Z направляющие.

Объекты, находящиеся в пространстве, занимают Положение и Направление относительно Пивота пространства и его Направляющих.

Примеры направляющих из вьюпорта обычно используют World Space направляющие относительно направления камеры.

Blender
Blender
UE
UE
Unity
Unity

Обратите внимание, UP вектор в Unity использует значение Y, в отличии от прочих, использующих Z.

Важно понимать, что идентичная концепция, может иметь разное представление в отличной среде.

Пространства могут иметь и прочую размерность, в этой статье мы будем говорить исключительно о Эвклидовых пространствах.

Распространенные пространства

1.World Space

Из названия понятно, что это пространство Мира в котором существует сцена/левел. Она статична и любой объект созданный напрямую в сцене сразу попадает в World Space.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Передвигая объект, изменяется и его положение в World Space, которое наглядно демонстрирует компонент Transform в поле Location.

2.Object/Local Space

Каждый объект так же имеет собственное(локальное) пространство, начало которого определено его пивотом.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Статичный объект внутри Object Space, сохраняет свое положение вне зависимости от положения в World Space.

3.Camera/View Space

Аналогично Object Space, Camera Space так же располагается в объекте, но в этом случае конкретно в камере.

Фиксирован одним вектором в глубину, и наверх/вправо остальными, что делает его положение на экране всегда предсказуемым.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

4.Tangent Space

Пожалуй сложнейшее для понимания и объяснения пространство.

Каждая вершина объекта обладает собственным пространством, которое всегда перпендикулярно Нормали и определяет направления Касательной и Бинормали на основе UV координат.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Звучит сложно, попробуем изобразить наглядно.

Мы не ограничены вершинами, пространство так же ожидаемо работает и с Fragment контекстом после интерполяции.

Причем тут трансформ и умножение матриц?

Данные о положении и направлении хранит и изменяет компонент Transform, найти который вы можете в любом софте.

UE
UE
Blender
Blender
Unity
Unity
Houdini
Houdini

Все они обладают подобным набором свойств и выполняют идентичные функции.

Помимо положения в пространстве, пара важных параметров Scale и Rotation, которые отвечают за величину и направление объекта в пространстве соответственно.

В случаях, когда мы приводим объект из одного пространства в другое, меняются и его значения Transform. Очень кстати, что Transform хранит данные в матричном виде. Это открывает нам путь к использованию матричных операций/свойств/функций.

В этой статье мы не будем вдаваться в эту тему, просто скажем, что такая возможность у нас есть :^>

Если вам все же интересно капнуть глубже, рекомендую посмотреть крутое видео Джона Чапмана, объясняющего преобразования матриц для компьютерной графики и почему это так охренительно и производительно!

Или видео 3Blue1Brown, который объясняет все тоже самое в графическом виде.

Как применить эти знания?

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

Заснеженный камень

Создадим простой материал с базовым цветом и нормалью, используем его на меше.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Добавим текстуры снега и Lerp между схожими текстурами для смешивания.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Остается найти значение, на основе которого будет выбрана текстура.

Нам известно, что снег падающий на объект, с большей вероятностью находится на поверхности направленной к облакам.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

В этом случае, нормаль поверхности объекта, напрямую сообщает о коэффициенте смешивания.

Сейчас нормаль объект находится в Tangent Space, для того что бы перевести ее в World Space воспользуемся функцией Transform.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Для репрезентации UP вектора, нам достаточно использовать значение Z, X и Y вектора находятся в перпендикулярной плоскости и не влияют на результат.

Используем значение Z в качестве коэффициента для Lerp предварительно его заклемпив от 0 до 1.

Добавил SmoothStep для усиления контраста.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Таким образом, вне зависимости от положения объекта, нормаль, направленная вверх относительно World Space, всегда будет заснежена, и наоборот.

Но что, если мы хотим использовать заснеженную часть по отношению к объекту, что бы снег всегда оставался на его оригинальной макушке?

В этом случае воспользуемся преобразованием в Object Space.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Теперь нормали будут смотреть вверх относительно локального пространства объекта и следовать за его направлением.

Паралакс Шейдер

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

Выглядит круто, и скрывает под собой простую реализацию.

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

Я буду использовать крутой меч, который нашел на Scetchfab

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

В BaseColor мапу добавляем область которую мы будем красить шейдером в альфаканал.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Находим изображение с космической пылью.

Для своего примера, отчистил подходящее от звезд нейросетями, после чего затайлил используя PixPlant.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Отдельно собираем звезды на на альфа канале, которые добавят глубины.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Собираем базовый материал и располагаем меч на сцене.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Добавим значения Alpha канала из BaseColor в качестве параметра смешивания через Lerp с текстурой космоса.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

На текстуре заметны швы в местах с разорванной разверткой, сама текстура просто наложена поверх меча и статична.

Чтобы решить эту проблему, попробуем представить пространство нашего экрана в качестве UV координат в ширину и высоту, эти данные мы можем получить используя преобразование TransformPosition из Object Space в Camera Space.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

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

Семплируем текстуру используя эти координаты и добавим контроллер масштаба UV координат.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Добавим поверх пару слоев со звездами используя разное масштабирование и их альфа канал в качестве масок смешивания.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖

Все еще не хватает объема, текстуры как бы приклеены друг к другу. Добавим движения с разной скоростью на основе времени.

Координатные пространства/Coordinate Space в компьютерной графике. Объясняю на чайниках 🫖
Красота-то какая... лепота
Красота-то какая... лепота

...Но мы можем лучше!

Унесем яркие звезды на Emmisive слой, добавим шумов для блеска, приглушим свет иии...

Благодарю за прочтение и, разумеется,

Если у вас есть желание поддержать автора статьи, то вы можете:

-Бахнуть по кнопке лайк, чтобы она взорвалась ❤

-Поделиться этой статьёй с людьми, которым интересна тема компьютерной графики.

-Подписаться на мой блог:

-Оставить фидбек под статьёй и пожелания о топиках, которые были бы вам интересны.

-Типнуть на кофеёк

Деловая почта: shakoretka@yandex.ru

11
4 комментария