{"id":2575,"title":"\u041a\u0430\u043a \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0430\u0445","url":"\/redirect?component=advertising&id=2575&url=https:\/\/vc.ru\/promo\/324373-kto-smotrit-nishevye-serialy-a-kto-na-nih-zarabatyvaet&placeBit=1&hash=61d0c31e5042232fa37d7d77c6be18388ccb9dfcd0148700e688bc836c310567","isPaidAndBannersEnabled":false}
Укроп

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

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

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

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

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

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

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

Mesh renderer отвечает за отрисовку объекта и теней с отражениями.

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

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

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

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

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

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

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

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

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

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

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

Объясняю :

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

Булевую переменную сделал чтобы нормали пересчитывались после деформации, а не во время. Капля оптимизации так сказать.

Следующий вектор-массив содержит в себе геометрию с последней деформации.

После идут два тяжелых цикла :

За каждую вершину меша, в которой вершины соприкоснулись с инородным объектом, сделать вот это :

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

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

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

Вообще и стандартный примитив в виде сферы способен деформироваться :

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

0
2 комментария
Популярные
По порядку
Александр Человек

А после выстрела из пушки шары разве должны подпрыгивать вверх?

Ответить
0
Развернуть ветку
Укроп

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

Ответить
0
Развернуть ветку
Читать все 2 комментария
null