Задача: разрушить в Блендер 3D каменную средневековую башню.
На видео (0:33) можно посмотреть результат:
Полное видео проекта:
Статья написана для опытных пользователей Blender 3d.
Башня должна сначала качаться (1), затем распадается на связанные фрагменты (2) которые в свою очередь должны развалиться на камни (3). Все сопровождается разлетом мелких камешков, пыли, мусора.
3d графику часто используют для разрушения больших объектов, при этом задействуется сразу несколько систем симулирования- физика твердых тел, частицы, флюиды (объем). В Блендере эти системы реализованы через модификаторы Rigid body, ParticleSystem,Fluid. Первая будет отвечать за физику взаимодействия больших камней между собой, вторая за очень мелкие камни и мусор и третья за пыль. Почему для мелких камней тоже не использовать Rigid body? Из-за двух причин -расчет в ParticleSystem намного быстрее чем в Rigid body хоть и менее реалистичный, так же Блендер как то странно может обработать симуляцию предметов меньше 8 см (https://docs.blender.org/manual/en/latest/physics/rigid_body/tips.html).
Заранее подготовим стационарные не разрушаемые части соединенных с башней стен. Для этого смоделируем обрушенную частично кладку. В моем случае я просто экструдировал грани камней где хотел, чтобы прошел раскол, разделять надо конечно между камнями.
Делаем стены башни
Создаем небольшой кусок стены из отдельных притертых боксов — делаем границы куска взаимостыкуемыми с небольшим зазором (1). Копипастим кусок формируя фронтальную часть башни (2). Формируем зубья и выступы также из боксов ,немного детализируем бревнами и кантом. Копипастим фронтальную часть стены на оставшиеся стороны (3). Стараемся избегать пересечения камней между собой — всегда оставляем небольшой зазор, иначе камни разлетятся в самом начале симуляции. Добавляем интерьерные детали по вкусу- они будут формировать мусор.
Заполняем камнями стационарные не разрушаемые части прилежащих к башни стен, можно использовать уже созданный кусок.
Для группировки систем симуляции создадим несколько коллекций Rigid body, ParticleSystem,Fluid(volume) соответственно:
Переместим все камни в первую коллекцию.
Анимация раскачивания башни
Поскольку башня будет ломаться не у самой земли а чуть выше прикинем где будет та часть башни что останется на земле нетронутой а где будет та что совершит падение. В центре стыка этих частей создадим пустышку. Установим ее родителем для всех объектов динамичной (падающей) части башни и стен.
Создадим простенькую анимацию небольшого вращения пустышки с возвратом и замедлением в конце. Это даст хороший импульс камням для эффектного падения в нужную нам сторону:
Симуляция твердых тел
Я понимаю что современного цемента на момент раннего средневековья не было, но разрушение башни через промежуточные сегменты смотрится более эффектно. Поэтому давайте сначала разобьем нашу группу камней на эти сегменты, количество сегментов выберете на свой вкус. Создадим в коллекции phy_rb подколлекции для каждого сегмента, я дополнительно разделил подколлекциями башню, шлюз, стены. Для мелкого мусора я создал подколлекции decor:
В дальнейшем для быстрого выделения камней сегментов вы можете использовать критерий группировки по коллекции- это удобно. Также коллекции вида *_phy_eff будем использовать для ограничения использования каких либо эффектов только на одну систему симуляции, а коллекции *_col на ограничения взаимодействия с эффекторами.
Пример:
Поэтапно выделяйте группы камней формирующих сегмент и перемещайте в соответствующею коллекцию сегмента. Статичный низ башни тоже можно переместить в свою "статичную" коллекцию:
Подготавливаем объекты симуляции Rigid body
Выделяем все объекты статической коллекции, выбираем меню Object — Rigid body — Add passive. На вкладке физика настраиваем параметры статичного объекта:
Где Type — тип объекта -пассивный объект не изменяет свое положение, но имеет коллизию с другими объектами, Animated — позволяет передавать управление объектом между системной анимации и системой симуляции, Shape — меш используемый для расчета коллизии объекта: Convex Hull -выпуклая оболочки без учета отверстий (быстрый расчет, но менее точный), Mesh — оболочка эквивалентна форме объекта (медленный расчет, но более точная симуляция) Surface Response это группа отвечает за взаимодействие поверхностей — Friction устанавливает силу трения, а Bounciness упругость. (чем больше упругость тем сильнее обратный импульс силы- отскок)
Обращаю ваше внимание на важную настройку коллизии Source — она позволяет указывать при расчете коллизии какую использовать сетку объекта базовую (Base) или модифицированную Final (с применением всего стека модификаторов объекта). Если вы хотите добавить мелких деталей объекту при рендере через модификатор сабдив и дисплейсмент, но при этом расчет его симуляции вести на базовой сетки -то это настройка поможет вам это сделать.
Поскольку у нас есть земля о которую также должны разрушаться сегменты давайте создадим ее. Проще всего создать над имеющейся высокополигональной земле сетку с небольшим разрешением (40х40) и модификатором ShrinkWarp спроецировать ее на имеющеюся землю. Добавить сетке Rigid Body - passive с Shape - Mesh и переместить ее в пассивную коллекцию.
Выделяем все камни всех коллекции сегментов кроме статичной, выбираем меню Object — Rigid body — Add Active. На вкладке физика настраиваем параметры активного объекта:
Включаем на всех активных камнях галочку анимации указывая что сначала мы хотим сами анимировать камни и лишь в нужный момент передать управлению симуляции.
Рассчитаем массу каждого камня исходя из его объема и плотности. Object — Rigid body — Calculate Mass, выбираем Stone
Для сцепления камней внутри сегмента будем использовать Rigid Body constrain. Выделим в первом сегменте все камни. В меню выбираем Object — Rigid body — Connect, через некоторое время (может тормозить) появятся пустышки связей:
Эти пустышки наш «цемент» и тем он прочнее чем больше значение в Threshold- порога величины силы импульса для разрыва связи. Тип Fixed указывает что соединяемые между собой объекты закреплены жестко без возможности смещений. Отмечу что по умолчанию коллизия между камнями в рамках связи лучше отключить Disable Collisions так будет проще контролировать развал сегмента. Создадим подколлекцию в коллекции сегмента и переместим туда все полученные пустышки. Повторяем для всех сегментов.
Поскольку у нас сегменты будут отваливаться в разное время создадим для каждого сегмента анимацию включения симуляции камней. Эта симуляция для простоты дальнейшей подгонки и корректировки будут общей для всех камней в рамках одного сегмента. Для этого выделим любой камень сегмента и создадим анимацию отключения галочки Animated. Время выбирайте в период возвратного падения башни по своему вкусу.
Линкуем эту анимацию выбранного камня всем камням в коллекции. Повторяем для всех сегментов. Время включения для каждого сегмента лучше смещать немного на 5-10 фреймов, самыми первыми включающими симуляцию лучше выбрать нижние сегменты.
Если происходит сильное ударение сегмента с землей или с другим сегментом он должен рассыпаться на камни за счет разрыва связей, но если это не происходит или происходит сильно быстро- то откорректируйте значение Threshold связи.
Настраиваем симуляцию Rigid Body
Заходим в глобальные настройки симуляции твердотельных объектов:
Устанавливаем скорость симуляции по своему вкусу — для массивных объектов лучше использовать меньшие значения Speed от 0.6-0.4.
Указываем количество расчета шагов симуляции на один кадр Substep per frame- в теории чем больше это значение тем более качественно и медленнее будет просчитываться симуляция. На практике я редко использовал больше 2-5. Можно оставить как по умолчанию 10, но сильно разницы в расчете я не увидел, а вот скорость расчета упала.
Рекомендую для сепарации (ЧТО ЭТО ЗА СЛОВО?!!! Правильно скОжите, русский человек? Хорошо — «разделение».) взаимодействия эффектов между различными системами симуляции обязательно создавайте отдельные коллекции эффектов для каждого типа симуляции, иначе турбулентность при расчете пыли может мешать например расчету полета мусора в другой системе. Для этого создадим подколлецию phy_rb_eff коллекции phy_rb и поместим в новую коллекцию эффекты , можно например с помощью эффекта ветра изменить вектор падения камней, или задать больше угловой скорости и тд. Укажем в поле Effector Collection ограничивающем коллекцию эффектов нашу коллекцию phy_rb_eff.
Устанавливаем в поле Cache фреймы начала и конца анимации, начало анимации выставите равным фрейму самой первой анимации включения симуляции камней, чтоб оптимизировать время расчета.
Нажмите кнопку расчета симуляции Bake, и ждем и обмахивает комп веером. Когда симуляция рассчиталась можно ее проиграть и откорректировать.
На камни которые будут ближе всего в камере назначите модификатор подразделения и несколько модификаторов деформации. На скорость симуляции это не повлияет как я уже отмечал выше, однако скорость проигрывания анимации уменьшится(можно отключить применение модификаторов для вьюпорта).
Если интересно то буду писать дальше о создании пыли, мусоре, ткани.
LeshaRB
Судя по форуму https://gamedev.ru/projects/forum/?id=196403
Разработка идет уже лет 10 почти... Есть какие-то планы о будущем игры?
IgorYakovlev Автор
Да, стим бесплатная демка и патреон с бости. Есть связи с известными летсплейщиками готовыми сыграть в демку когда будет готова.