Найти в Дзене
Stronghold of gamedev

Деформация модели внутри движка

Оглавление

Физика ткани, физика мягких тел, деформирующие вмятины на твердом объекте и симуляция воды, всё это - процедурное изменение геометрии меша посредствам движка и кода. На всё кроме последнего я уже выпускал статьи, но...

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

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

Восприятие меша движком

После импорта модели в движок и добавлении её на сцену, Unity дает ему 2 основополагающих компонента для существования :

-2

Mesh Filter отвечает за геометрию, в нем лежит импортированная модель, а точнее её геометрическая сетка.
Mesh renderer отвечает за отрисовку объекта и теней с отражениями.

Работа будет производится над геометрией, поэтому все вопросы будут к Mesh Filter. В статье про 3D моделирование я уже упомянул, что совершенно дефолтный для моделей формат .obj, при открытии его через текстовый редактор, содержит в себе различную информацию, такую как вектора расположения вершин относительно центра координат, с этим движок и работает.

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

-3

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

Магия началась

Модель куба на первый взгляд совершенно простая, мол 6 полигонов, 8 вершин, но это не так. Чем сложнее сетка - тем детальнее деформация.

Результат нескольких subdivide и триангуляции
Результат нескольких subdivide и триангуляции

В самом коде имеется несколько переменных, участвующих в деформации , ссылка на Mesh Filter и массив Векторов, в который я занес начальное расположение всех точек до деформации, к этому состоянию можно будет вернуться : мгновенно восстановить форму чтобы продолжить играться, либо в реализации мягкого тела например, установить эту геометрию как ту, к которой модель будет стремиться.

-5

Сама деформация, логично полагать, происходит по столкновению с другими объектами и здесь уже 2 варианта : метод OnCollisionEnter, вызываемый только в начале контакта или OnCollisionStay, подходящий для продолжительного изменения геометрии, как опять таки в ситуации с мягкими телами.

Я буду использовать первый вариант, так как объект мой тверд и лишь невероятная сила способна ударным методом изменить его геометрию.
Невероятная сила это -
minVelocity, принимающая значение 5, тоже вариативно, меньше значение - деформируется хоть от виртуального плевка. От этой переменной так же зависит и сила деформации, я всё же вернусь к стене ради одной гифки :

Сила выстрела левой пушки - 1000, правой - 5000.
Сила выстрела левой пушки - 1000, правой - 5000.

Происходит это так :

-7

Объясняю :
Как только объект коснется другого, проверяется скорость, на которой они столкнулись, если скорость больше минимальной, которую я указал выше, метод выполняется дальше.
Булевую переменную сделал чтобы нормали пересчитывались после деформации, а не во время. Капля оптимизации так сказать.
Следующий вектор-массив содержит в себе геометрию с последней деформации.
После идут два тяжелых цикла :
За каждую вершину меша, в которой вершины соприкоснулись с инородным объектом, сделать вот это :
Вектор точки соприкосновения, вектор скорости (на самом деле вектор направления, но он не ограничен единицей), определить расстояние от точки контакта до ближайшей вершины и если расстояние меньше условной области поражения, сместить вершины куда надо с учетом переменных.

Кстати переменная multiplay влияет на возможную глубину деформации :

-8

Левый куб настроен более жестко, радиус деформации меньше.
Вообще и стандартный примитив в виде сферы способен деформироваться :

-9

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

Соседние статьи с канала о процедурном изменении модели :
Как работает разрушаемость в играх
Как работает физика ткани
Мягкие тела