2D мягкие тела: гели и формуемые?

Я использую физику Matter.js в попытке создать мягкие тела. Мне удалось создать такое тело:

matter.js soft body

Однако я не уверен, что это "мягкое тело", которое я хочу. Это правда, что это тело не является полностью жестким и имеет такое бодрое чувство, когда оно сталкивается и затягивается. Я искал тело, которое имеет сходство с гелем. Это изображение может визуально помочь объяснить концепцию:

wanted-gelly-body

Мне было интересно, как можно сделать такие типы тел. Это то же самое, что и у материи. Мягкое тело, но с очень специфическим типом свойств? Я могу получить только тело, которое будет иметь форму жесткого квадрата, а не как формульное и круговое, как мне бы хотелось.

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

Может ли matter.js справиться с этим или мне нужно изменить физический движок? Любые решения для этого?

ПРИМЕЧАНИЕ. Я использую Phaser.js для некоторых игровых компонентов, но физика материи .js для манипуляций с физикой, потому что я считаю, что интегрированная с Phaser физика не может имитировать этот тип сложного тела.

Спасибо

EDIT: он очень похож на этот Box2d: ролл мягкого тела мяч. Мне просто нужно сделать это с помощью js-движка, я думаю. Есть ли?

Ответ 1

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


Я постараюсь ответить на это:

Мне было интересно, как можно сделать такие типы тел.... Я могу получить только тело, которое было бы жестким, а не формульным и круговым, как хотелось бы.

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

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

  • Точка подключена ко всем остальным точкам, указанным в вашей сетке.
  • Каждый шаг времени вычисляется между каждой парой. Полная сила на суставе (или точке) является суммой всех этих парных сил.
  • Каждое соединение связано с частью тела (т.е. имеет некоторую массу m), и вы рассчитываете его ускорение с помощью acceleration = force/m. Оттуда мы вычисляем velocity и, наконец, position.

Самая интересная часть вышеприведенных шагов - nr 2, так как это сильно повлияет на движение всего тела. Очень распространенный способ его реализации - это как упругий потенциал, который при некотором distance между двумя точками дает некоторый force. Например:

function elasticPotential(p1, p2) {
    // Given two positions p1 and p2 we calculate a force between them
    distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) + pow(p1.z - p2.z, 2));
    force = force_given_distance(distance); // A popular choice here is for example a spring force
    return force;
}

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

Простая пластичность

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

for each pair(p1, p2):
    if distance(p1, p2) > threshold:
        recalculate_connection(p1, p2)

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

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


TL; ДР: Создайте "формуемую форму", решая тело во время деформации. Было бы сложно получить точное физическое поведение, но должно быть возможно создать что-то, что выглядит "похожим на гели".