Разбор демо от Мэтта Старка

<?the_title()?>

Твит, показывающий странный эффект, который я создал в Unity, стал довольно популярным, поэтому я решил подробнее рассказать, как этот эффект был создан.

Вот видео:

https://youtu.be/Z_RQenPprUc

Каждый дверной проем имеет скрытую стену, которая становится видимой, когда вы проходите триггер. Одновременно камерой генерируется и наносится на стену текстура. Вот как это выглядит под другим углом:

Эффект хитрого койота

Эффект можно поделить на две части: генерация текстуры и применение ее к объекту.

Генерация текстуры

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

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

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

Затем камера рендерит изображение, используя текстуру в качестве Render target’а. Я использовал текстуру 1024 х 1024 пикселей. Производимая текстура выглядит так:

Сгенерированная текстура

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

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

Диаграмма сгенерированной текстуры

Применение текстуры к объекту

Следующая задача — правильно отобразить текстуру на объекте. Если бы мы просто применили текстуру, используя UV-координаты объекта, она бы выглядела так (я включил каркас, чтобы сделать форму более понятной):

Неправильная проекция

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

Перед удалением временной камеры вычисляется матрица, которая преобразует мировое пространство в пространство экрана для камеры. Она находится путем умножения матрицы проекции на мировые координаты на матрицу координат камеры:

Эта матрица передается в шейдер вместе с текстурой. В вершинном шейдере вычисляется мировое положение вершины (worldPos — это float3, добавленный в структуру v2f).

Во фрагментном шейдере положение в мировом пространстве проецируется в пространство экрана временной камеры и используется для выборки текстуры:

Теперь текстура корректно отображается на объекте!

Правильная проекция

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

Источник: https://matt.stark.scot/2019/11/06/wile-e-coyote-effect.html

Понравилась статья? Поделиться с друзьями:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *