2D мягкие тела: желе и формуемые?
Я использую физику Matter.js в попытке создать мягкие тела. Я был в состоянии создать тело как это:
Однако я не уверен, что это "мягкое тело", которое я хочу. Это правда, что это тело не совсем жесткое и имеет такое бодрое ощущение, когда оно сталкивается и тянется. Я искал тело, которое разделяет сходство с гелем. Это изображение может визуально помочь объяснить концепцию:
Мне было интересно, как эти типы тел могут быть сделаны. Это то же самое, что и мягкое тело наподобие материи, но с очень специфическими свойствами? Я могу только заставить тело быть жестким квадратом, а не таким формуемым и круглым, как хотелось бы.
Мне также интересно манипулировать физическим телом с помощью внутриигровых взаимодействий, которые увеличивают или уменьшают размер физического тела, что еще раз подводит меня к выводу, что тип тела, который я хочу, должен быть вполне формуемым.
Могу ли я с этим справиться.js или мне нужно изменить физический движок? Какие-нибудь решения, чтобы приблизиться к этому?
ПРИМЕЧАНИЕ: я использую Phaser.js для некоторых внутриигровых компонентов, но физика Материи.js для манипулирования физикой, потому что я считаю, что интегрированная физика Phaser не может моделировать этот тип сложного тела.
Спасибо
РЕДАКТИРОВАТЬ: Это очень похоже на этот Box2d: ролл мяч мягкого тела. Мне просто нужно сделать это с движком JS, я думаю. Есть ли?
1 ответ
Как я упоминал в комментариях, я не знаком с phaser или с тем, как бы вы на самом деле реализовали это в рамках Javascript. Моя цель здесь, может быть, дать вам некоторые идеи о различных путях, так что, надеюсь, вы найдете этот ответ полезным.
Я постараюсь ответить на это:
Мне было интересно, как эти типы тел могут быть сделаны.... Я могу только заставить тело быть жестким квадратом, а не таким формуемым и круглым, как хотелось бы.
Не обязательно ясно, что вы хотите, учитывая это предложение. Как я отмечал в комментариях, я думаю, что вы ищете пластичность, и я опишу способ, которым вы могли бы "обмануть" внешний вид с помощью нескольких простых инструментов.
В данный момент вы описываете движение своего тела следующим образом: "Это правда, что это тело не совсем жесткое и обладает таким упругим ощущением, когда оно сталкивается и тянется". В настоящее время ваша модель работает так:
- Точка связана со всеми другими точками, указанными в вашей сетке.
- Каждый шаг времени, сила рассчитывается между каждой парой. Общая сила в соединении (или точке) является суммой всех этих парных сил.
- Каждый сустав связан с частью тела (т.е. имеет некоторую массу
m
) и вы рассчитываете его ускорение сacceleration = force/m
, С этого момента мы рассчитываемvelocity
и наконецposition
,
Самая интересная часть вышеприведенных шагов - это номер 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;
}
Теперь у вас уже есть функция, описанная выше, встроенная в вашу среду, так что вам не нужно ее реализовывать. Причина, по которой я это описываю, заключается в том, что это важно для понимания того, как мы можем создать пластичность. Проблема с вышесказанным заключается в том, что ничто не сохранит деформацию- природа упругого потенциала заключается в том, что он имеет некоторую конфигурацию покоя (скорее всего, вашу первую конфигурацию), и он всегда будет пытаться вернуться к этой форме. Мы хотим, чтобы форма помнила, как она была неправильной. Вот что такое пластичность.
Простая пластика
Сначала отметим, что проблема пластичности является большой темой исследования и во многих случаях далека от тривиальной. Моя идея заключается в следующем: если расстояние между двумя соединенными точками больше некоторого порога, объедините точки в текущей конфигурации. То есть,
for each pair(p1, p2):
if distance(p1, p2) > threshold:
recalculate_connection(p1, p2)
Как видите, это очень простая модель для пластичности, и, скорее всего, не физически правильная. Тем не менее, должно быть возможно получить интересное поведение, когда я играю с ремишингом, вместе с тем, какой эластичный потенциал вы выберете.
Если вы предоставите мне более подробную информацию, я смогу обсудить проблему дальше, но сейчас я чувствую, что этот ответ уже длиннее, чем должен быть.
TL; DR: создайте "формуемую" форму, объединяя тело во время деформации. Может быть сложно получить точное желаемое физическое поведение, но должно быть возможно создать нечто, похожее на "гелеобразное".