Вдобавок ко мне, предложение, которое бросается в глаза, это то, что вы хотите, чтобы площадь была постоянной. Это кажется мне болью во всем этом, поэтому давайте попробуем найти простое решение.
Возьмите кусок нити и свяжите концы вместе, чтобы сделать круг. Возможно, я ошибаюсь, но моя интуиция говорит, что внутренняя часть этой строки имеет постоянную площадь или будет действовать очень похоже на вашу границу амебы.
Так что я бы сказал: реализовать строку. ;) Большинство библиотек физики могут создавать пружины (в Box2D это выглядит как соединение расстояний), и самый простой способ создать строку - это соединить множество строк вместе. Соедините последний до первого, чтобы создать цикл. Убедитесь, что пружины в струне имеют достаточно высокую пружинную постоянную, чтобы не растягиваться на части - вы хотите, чтобы они были достаточно жесткими и двигались в унисон, а не расширялись.
Затем создайте силы, чтобы действовать на строку. Тривиально, ваши два ядра / глаза / контрольные точки создают силы на точки, которые составляют строку. Заставьте силу упасть с помощью функции обратного квадрата:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
И сделайте направление силы прямо от контрольного глаза / шара, как отталкивающая сила, исходящая от шара. Твик К, чтобы контролировать силу силы. Удостоверьтесь, что K не слишком высоко - вы не хотите, чтобы сила просто толкнула его, просто держите его подальше от шаров. Оставьте много провисания в вашей строке.
Только с этими двумя вы, вероятно, получите в итоге довольно однородную форму, поэтому я бы также предложил вам создать более слабые силы вокруг окружающего «супа», чтобы изменить форму амебы. Вы можете создавать эти случайные места, регулярно менять их силу (вы можете сделать это синусоидальной функцией для хороших движений) и заставить их работать так же, как шары.
Вагинация (фнарр): это сложный вопрос. Вы заставляете его обернуть объект, проверяя, удалось ли двум несмежным точкам в строке подойти достаточно близко, и если да, то вам нужно:
Измерьте расстояние между точками на строке. Подсчитайте количество весенних секций. Найдите «более короткий» путь от А до Б.
Разбейте строку и снова соедините ее с двумя соседними точками. Другими словами, непосредственно соедините точку A с точкой B и отбросьте все промежуточное содержимое.
Вставьте недостающее количество баллов (плюс любые бонусные баллы, если вы хотите увеличить размер, съев что-то) в строку на другой стороне - то есть стороне от B до A. Если вы вставите их одинаково по длине и сделав их короче, чем желаемое расстояние между точками, вы получите приятный эффект пружинящего расширения.
Я думаю, что это охватывает все. Кстати: идея звучит потрясающе.