Z góry mojej głowy wystaje klauzula, że chcesz, aby obszar był stały. Uderza mnie to w tym wszystkim, więc spróbujmy znaleźć proste rozwiązanie tego problemu.
Weź kawałek sznurka i związaj końce razem, aby utworzyć koło. Mogę się mylić, ale moja intuicja mówi, że wnętrze tego sznurka ma stały obszar lub działałoby okropnie podobnie jak twoja granica ameby.
Powiedziałbym więc: zaimplementuj ciąg. ;) Większość bibliotek fizyki może wykonywać sprężyny (w Box2D wygląda to na odległość), a najłatwiejszym sposobem na utworzenie łańcucha jest połączenie wielu łańcuchów razem. Dołącz do ostatniego do pierwszego, aby utworzyć pętlę. Upewnij się, że sprężyny w sznurku mają wystarczająco wysoką stałą sprężyny, aby się nie rozdzieliły - chcesz, aby były dość sztywne i poruszały się zgodnie, aby się nie rozszerzały.
Następnie utwórz siły działające na łańcuch. Trywialnie, twoje dwa rdzenie / oczy / punkty kontrolne wytwarzają siły na punkty, które tworzą strunę. Spraw, aby siła spadła dzięki odwrotnej funkcji kwadratowej:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
I kieruj siłę bezpośrednio z dala od oka / piłki kontrolnej, jak siła odstraszająca emanująca z piłki. Dostosuj K, aby kontrolować siłę siły. Upewnij się, że K nie jest zbyt wysoki - nie chcesz, aby został po prostu mocno wypchnięty przez siłę, po prostu trzymaj go z dala od piłek. Pozostaw dużo luzu w swoim sznurku.
Tylko z tymi dwoma najprawdopodobniej skończysz z dość jednolitym kształtem, więc sugeruję również, abyś stworzył słabsze siły wokół otaczającej „zupy”, aby zmienić kształt ameby. Możesz tworzyć losowe miejsca, zmieniać ich siłę regularnie (możesz sprawić, że będzie to funkcja sinusoidalna dla przyjemnych ruchów) i sprawić, by działały tak samo jak kule.
Vagination (fnarr): to jest trudne. Sprawiasz, że otacza on obiekt, sprawdzając, czy dwa nieprzylegające do siebie punkty na ciągu nie zbliżyły się wystarczająco, a jeśli tak, musisz:
Zmierz odległość między punktami na sznurku. Policz liczbę sekcji sprężyn. Znajdź „krótszą” ścieżkę od A do B.
Zerwij sznurek i połącz go ponownie z dwoma sąsiadującymi punktami. Innymi słowy, bezpośrednio połącz punkt A z punktem B i odrzuć wszystkie rzeczy między nimi.
Ponownie wstaw brakującą liczbę punktów (plus wszelkie dodatkowe punkty, jeśli chcesz zwiększyć rozmiar poprzez zjedzenie czegoś) do sznurka po drugiej stronie - tj. Stronie od B do A. Jeśli wstawisz je równomiernie na całej długości i aby były krótsze niż pożądana odległość między punktami, powinieneś uzyskać ładny efekt sprężystości-rozciągnięcia.
Myślę, że to wszystko obejmuje. Nawiasem mówiąc: pomysł brzmi niesamowicie.