Физика ткани, физика мягких тел, деформирующие вмятины на твердом объекте и симуляция воды, всё это - процедурное изменение геометрии меша посредствам движка и кода. На всё кроме последнего я уже выпускал статьи, но...
Но канал совсем недавно перешагнул 500 подписчиков и я с самого начала активного роста частенько видел коллег в комментариях, а еще просьбы более глубокого разбора темы и кусков кода.
В этой статье я с помощью очередной демки пошагово разберу метод деформации меша и вкину немножко кода, чтобы было что объяснять.
Статья понятна обывателю и вероятно интересна человеку, который как-то касается разработки на Unity.
Восприятие меша движком
После импорта модели в движок и добавлении её на сцену, Unity дает ему 2 основополагающих компонента для существования :
Mesh Filter отвечает за геометрию, в нем лежит импортированная модель, а точнее её геометрическая сетка.
Mesh renderer отвечает за отрисовку объекта и теней с отражениями.
Работа будет производится над геометрией, поэтому все вопросы будут к Mesh Filter. В статье про 3D моделирование я уже упомянул, что совершенно дефолтный для моделей формат .obj, при открытии его через текстовый редактор, содержит в себе различную информацию, такую как вектора расположения вершин относительно центра координат, с этим движок и работает.
Пациентом будет куб слева, ибо уже готовую стену из старой статьи будет использовать не честно.
Спойлер : для деформации объекта с помощью итогового скрипта не понадобится никаких лишних костылей. Объект будет взаимодействовать с любым предметом, имеющим коллайдер. Код так же достаточно прост и его можно доработать под свои нужды.
Магия началась
Модель куба на первый взгляд совершенно простая, мол 6 полигонов, 8 вершин, но это не так. Чем сложнее сетка - тем детальнее деформация.
В самом коде имеется несколько переменных, участвующих в деформации , ссылка на Mesh Filter и массив Векторов, в который я занес начальное расположение всех точек до деформации, к этому состоянию можно будет вернуться : мгновенно восстановить форму чтобы продолжить играться, либо в реализации мягкого тела например, установить эту геометрию как ту, к которой модель будет стремиться.
Сама деформация, логично полагать, происходит по столкновению с другими объектами и здесь уже 2 варианта : метод OnCollisionEnter, вызываемый только в начале контакта или OnCollisionStay, подходящий для продолжительного изменения геометрии, как опять таки в ситуации с мягкими телами.
Я буду использовать первый вариант, так как объект мой тверд и лишь невероятная сила способна ударным методом изменить его геометрию.
Невероятная сила это - minVelocity, принимающая значение 5, тоже вариативно, меньше значение - деформируется хоть от виртуального плевка. От этой переменной так же зависит и сила деформации, я всё же вернусь к стене ради одной гифки :
Происходит это так :
Объясняю :
Как только объект коснется другого, проверяется скорость, на которой они столкнулись, если скорость больше минимальной, которую я указал выше, метод выполняется дальше.
Булевую переменную сделал чтобы нормали пересчитывались после деформации, а не во время. Капля оптимизации так сказать.
Следующий вектор-массив содержит в себе геометрию с последней деформации.
После идут два тяжелых цикла :
За каждую вершину меша, в которой вершины соприкоснулись с инородным объектом, сделать вот это :
Вектор точки соприкосновения, вектор скорости (на самом деле вектор направления, но он не ограничен единицей), определить расстояние от точки контакта до ближайшей вершины и если расстояние меньше условной области поражения, сместить вершины куда надо с учетом переменных.
Кстати переменная multiplay влияет на возможную глубину деформации :
Левый куб настроен более жестко, радиус деформации меньше.
Вообще и стандартный примитив в виде сферы способен деформироваться :
Таким образом можно деформировать любую модель, а еще, как я уже заметил, этот код является неплохой основой для модифицирования и создания новых методов деформаций.
Соседние статьи с канала о процедурном изменении модели :
Как работает разрушаемость в играх
Как работает физика ткани
Мягкие тела