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