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

Как устроена NVIDIA Flex

Оглавление

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

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

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

Основы основ

Для начала, весь ассет NVIDIA Flex для Unity весит всего 14 мегабайт, 5 из которых занимают модельки для демонстраций в сценках, остальное - пара скриптов, описывающие поведение партиклов.
Партиклами называют те самые сферки, которые вселяются в объект и становятся физической плотью оного на равне, а то и лучше обычных коллайдеров.

И с самых первых шагов необходимо выбрать вариант существования испытуемого. Flex дает на выбор два варианта :

  • ArrayActor - множество партиклов, что появятся в начале сцены - с ними и играйтесь
  • SourceActor - источник, откуда партиклы появляются. Конечно здесь можно выбрать время их жизни, так что может быть полезно для ручья например.

Более понятно будет на примере воды :

Source Actor - бесконечно создающий партиклы
Source Actor - бесконечно создающий партиклы
Array Actor - создавший нечто, изначально наследующий указанную геометрию
Array Actor - создавший нечто, изначально наследующий указанную геометрию

Твердые и мягкие тела

Мне совершенно не понятно, кто в здравом уме будет использовать Flex для симуляции поведения твердого тела (и мягкого в большинстве случаев), ведь он жрет в десятки больше ресурсов, работая точно так же!

Все же покажу работу для полноты картины и последовательности объяснений :

Твердое тело с "резиновым" пресетом
Твердое тело с "резиновым" пресетом

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

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

SoftActor
SoftActor

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

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

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

-6

А теперь спидран по объяснению : создав объект пустышку, ей нужно добавить компонент поведения что вы желаете (картиночка 1), после создав и вставив в первый слот FlexContainer - это скрипт с описанием общего поведения(2), а второй (в моем случае FlexSoftAsset) - с конкретными настройками под выбранное поведение(3).
Для визуализации модели в изначальном её виде нужно добавить Flex Soft Skinning и стандартный Skinned Mesh Renderer (4).

Все это дело конечно же взаимодействует с родными, описанными Unity твердыми телами :

Порох кончился :(
Порох кончился :(

Ткань

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

Обычные партиклы
Обычные партиклы
Партиклы + mesh filter, mesh renderer и Flex Cloth Deformation
Партиклы + mesh filter, mesh renderer и Flex Cloth Deformation
Взаимодействие с обычным Rigidbody
Взаимодействие с обычным Rigidbody

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

Водичка

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

Обычное поведение партиклов, что летят из "источника"
Обычное поведение партиклов, что летят из "источника"
После включения галочки "Fluid"
После включения галочки "Fluid"

Здесь можно сразу узреть, что по включению настройки "Fluid", сферки становятся более скользкими и начинают "липнуть" друг к другу. Так и выглядит внутренняя кухня симуляции физики. Получить ту красоту, что вы узрели в начале, можно добавив скрипт, шейдер и пробу окружающих отражений :

Водица, проба отражений и партиклы сквозь шейдер
Водица, проба отражений и партиклы сквозь шейдер

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

Из водички в ртуть и молоко
Из водички в ртуть и молоко
В нефть? Любая черная текстура и ползунок блеска
В нефть? Любая черная текстура и ползунок блеска

Но это все что касается графония. Там есть так же настройки физики. Как вязкость, скольжение и другие :

Размер партиклов
Размер партиклов
Сплоченность
Сплоченность
Вязкость
Вязкость

А вот в товарище ArrayActor все же проглядываются партиклы сквозь шейдер :

-20

А тут проглядываются мэмы и те же статьи, но с вероятными оповещениями и появлением в фид ленте : группа ВК
Все технологии NVIDIA в играх

Рекомендуем почитать
Документы, вакансии и контакты