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

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

вещество мягкое тело

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

хотел-Gelly тела

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

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

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

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

Спасибо

РЕДАКТИРОВАТЬ: Это очень похоже на этот Box2d: ролл мяч мягкого тела. Мне просто нужно сделать это с движком JS, я думаю. Есть ли?

1 ответ

Решение

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


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

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

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

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

  1. Точка связана со всеми другими точками, указанными в вашей сетке.
  2. Каждый шаг времени, сила рассчитывается между каждой парой. Общая сила в соединении (или точке) является суммой всех этих парных сил.
  3. Каждый сустав связан с частью тела (т.е. имеет некоторую массу 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: создайте "формуемую" форму, объединяя тело во время деформации. Может быть сложно получить точное желаемое физическое поведение, но должно быть возможно создать нечто, похожее на "гелеобразное".

Другие вопросы по тегам