Die Klausel, die mir besonders auffällt, ist, dass die Fläche konstant bleiben soll. Das scheint mir der Schmerz in all dem zu sein, also lasst uns versuchen, eine einfache Lösung dafür zu finden.
Nehmen Sie ein Stück Schnur und binden Sie die Enden zusammen, um einen Kreis zu bilden. Ich kann mich irren, aber meine Intuition besagt, dass die Innenseite dieser Saite eine konstante Fläche hat oder sich sehr ähnlich wie Ihre Amöbengrenze verhält.
Also würde ich sagen: Implementiere den String. ;) Die meisten Physikbibliotheken können Federn erstellen (in Box2D sieht dies wie das Distanzgelenk aus), und der einfachste Weg, eine Zeichenfolge zu erstellen, besteht darin, viele Zeichenfolgen miteinander zu verbinden. Verbinden Sie den letzten mit dem ersten, um eine Schleife zu erstellen. Stellen Sie sicher, dass die Federn in der Saite eine ausreichend hohe Federkonstante haben, um nicht gespannt zu werden - Sie möchten, dass sie ziemlich steif sind und sich im Einklang bewegen, nicht ausdehnen.
Als Nächstes erstellen Sie Kräfte, die auf die Zeichenfolge einwirken. Trivialerweise erzeugen Ihre beiden Kerne / Augen / Kontrollpunkte Kräfte auf die Punkte, aus denen die Saite besteht. Lassen Sie die Kraft mit einer umgekehrten quadratischen Funktion abfallen:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
Und richten Sie die Kraft direkt vom Kontrollauge / Ball weg, wie eine abstoßende Kraft, die vom Ball ausgeht. Drücke K, um die Stärke der Kraft zu kontrollieren. Stellen Sie sicher, dass K nicht zu hoch ist - Sie möchten nicht, dass es durch die Kraft massiv herausgedrückt wird, sondern halten es einfach von den Bällen fern. Lassen Sie viel Spiel in Ihrer Saite.
Wenn Sie nur diese beiden verwenden, werden Sie wahrscheinlich eine ziemlich einheitliche Form haben. Daher würde ich Ihnen auch vorschlagen, in der umgebenden "Suppe" schwächere Kräfte zu erzeugen, um die Form der Amöbe zu ändern. Sie können diese zufälligen Stellen erzeugen, ihre Kraft regelmäßig ändern (Sie können sie zu einer Sinusfunktion für schöne Bewegungen machen) und sie auf die gleiche Weise wie die Kugeln wirken lassen.
Vagination (Fnarr): Dies ist die schwierige. Sie veranlassen das Objekt, ein Objekt einzuhüllen, indem Sie überprüfen, ob zwei nicht benachbarte Punkte in der Zeichenfolge nahe genug beieinander liegen. In diesem Fall müssen Sie Folgendes tun:
Messen Sie den Abstand zwischen den Punkten auf der Schnur. Zählen Sie die Anzahl der Federteile. Finde den 'kürzeren' Weg von A nach B.
Brechen Sie die Schnur und verbinden Sie sie wieder mit den beiden benachbarten Punkten. Mit anderen Worten, verbinden Sie Punkt A direkt mit Punkt B und verwerfen Sie alles dazwischen liegende Material.
Fügen Sie die fehlende Anzahl von Punkten (plus Bonuspunkte, wenn Sie die Größe durch Essen erweitern möchten) erneut in die Zeichenfolge auf der anderen Seite ein, dh auf der Seite von B nach A. Wenn Sie sie gleichmäßig entlang der Länge und einfügen Wenn Sie sie kürzer als den gewünschten Abstand zwischen den Punkten machen, sollten Sie einen schönen Spring-Expandy-Effekt erzielen.
Ich denke, das deckt alles ab. Übrigens: Idee klingt großartig.