Имитация гидравлического пресса в Blender

Имитация гидравлического пресса в Blender

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

Задача былая такая: При должном давлении на камень (в будущем объект) он должен лопаться начиная с точки куда приложена сила. Ради интереса решил оформить все в стиле популярных видео на ютуб с прессами.

Я додумался до 3-х путей относительно реализации разрушения объекта:
1. Разбить весь объект заранее и сцепить все его части Joint'ами. Далее разбивать связь если будет приложено нужное количество силы.
2. Подменять в нужный кадр целый объект на заранее подготовленный разрушенный вариант как копперфильд. (так и делают большинство уроков на ютубе)
3. Автоматизировать процесс контролируя состояние анимации через питон. Ну и разрушая объект аддоном cell fracture в реальном времени.

Что же выбрать?

Оказывается физический движок не способен держать форму сложного объекта, состоящего из множества деталей. Ради производительности алгоритмы идут на компромисс и в итоге детали не всегда являются статичными относительно друг-друга. Мне не удалось найти баланс между качеством и скоростью просчитывания физики. Второй вариант про подмену я отбросил сразу, а что если я захочу оперативно изменить сцену? Мне придется вручную переделывать всю анимацию! Скажем так, это правильный путь для качественного и контролируемого спецэффекта, но мне просто не интересно это, ведь я хотел сделать кнопку "сделать сразу". По итогу выбор пал на третий вариант.

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

Так бля епта, тут у нас столкновение, хуе-мое, блядь, но если мы разрушаем объект во время рендера анимации, то получаем вылет, тааак, падажжи ебана

Что-то получилось

Чему я сильно удивился, так это что по факту в blender теперь нельзя детектировать столкновение! Вообще! К физ. движку через API попросту нельзя получить доступ к этой информации. Говоря "теперь" я имеют в виду то, что раньше можно было вынуть это событие через встроенный игровой движок и далее его обрабатывать, но теперь такой возможности нет. Но и опять же, я хотел бы обрабатывать столкновения в самом блендере чтобы потом отрендерить это.

Спустя n-часов раздумий я решил не изобретать костыль на тему поиска столкновений а использовать то, что использует сам Blender. Через питон я подключил враппер физ. либы Bullet. Через отлов смены кадра я обновлял "цифровую копию" физического мира. чтобы потом просто одной функцией проверять пересекает ли один объект другой. Да, это получается двойная работа, но по итогу я мог определять в точности все столкновения как их видит блендер у себя под капотом.

Для смеха: Я пытался получать точку и вектор столкновения двух мешей через гео-ноды. Надеюсь мне не придется говорить, что это решение бы работало в сотни (если не тысячи) раз медленнее библиотеки Bullet.

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

В момент X питон включает Cell Fracture и разрушает наш объект начиная с того места, где произошел контакт.

Имитация гидравлического пресса в Blender

Еще рендеры.

Под конец я решил сделать пресс чуть более красивым:

Итог

Если присмотреться, то пресс разламывает не только сам основной объект, но и его мелкие части, превращая их во все более мелкие камешки. Ну и самая физическая симуляция проходила во время самого рендера, не нужно было заранее настраивать шкалу анимации, все делал python.
Моя личная цель была выполнена.
Спасибо!

8
5 комментариев

Первый раз вижу гидравлический пресс с пружиной

3
Ответить

Так и знал что что-то не так

Ответить

Круть

1
Ответить

Чет как-то сложно. Мне кажется в какой-нибудь Cinema 4d или Houdini эта задача делается проще, без костылей

Ответить

Относительно Cinema 4D и Houdini, я не могу сказать, что одна из них является более простой, чем blender. Последний предоставил мне все необходимые инструменты и возможности для решения данной задачи, вот я его и взял)

Ответить