Dalla parte superiore della mia testa, la clausola che mi sporge è che vuoi che l'area sia costante. Questo mi colpisce come il dolore in tutto questo, quindi proviamo a trovare una soluzione semplice a questo.
Prendi un pezzo di spago e lega le estremità per formare un cerchio. Potrei sbagliarmi, ma la mia intuizione dice che l'interno di quella stringa ha un'area costante, o si comporterebbe in modo terribile come il confine dell'ameba.
Quindi direi: implementa la stringa. ;) La maggior parte delle librerie di fisica può fare molle (in Box2D questo sembra il giunto di distanza), e il modo più semplice per creare una stringa è collegare molte stringhe insieme. Unisci l'ultimo fino al primo per creare un loop. Assicurati che le molle nella corda abbiano una costante di molla abbastanza alta da non distanziarsi - vuoi che siano abbastanza rigide e si muovano all'unisono, non per espandersi.
Quindi, crea forze per agire sulla stringa. In sostanza, i tuoi due core / occhi / punti di controllo creano forze sui punti che compongono la corda. Fai cadere la forza con una funzione quadrata inversa:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
E fai allontanare la direzione della forza dall'occhio / palla di controllo, come una forza repellente che emana dalla palla. Modifica K per controllare la forza della forza. Assicurati che K non sia troppo alto - non vuoi che venga espulso in modo massiccio dalla forza, tienilo lontano dalle palle. Lascia un sacco di gioco nella corda.
Con solo quei due probabilmente finirai con una forma abbastanza uniforme, quindi suggerirei anche di creare alcune forze più deboli nella "zuppa" circostante per cambiare la forma dell'ameba. Puoi creare questi posti casuali, cambiarne regolarmente la forza (potresti renderlo una funzione sinusoidale per movimenti piacevoli) e farli funzionare allo stesso modo delle palle.
Vaginazione (fnarr): questa è quella difficile. Lo fai avvolgere un oggetto controllando se due punti non adiacenti sulla stringa sono riusciti ad avvicinarsi abbastanza e, in tal caso, devi:
Misura la distanza tra i punti sulla corda. Conta il numero di sezioni di molla. Trova il percorso "più breve" da A a B.
Rompere la stringa e ricollegarla con i due punti adiacenti. In altre parole, unisci direttamente il punto A al punto B e scarta tutte le cose in mezzo.
Reinserisci il numero mancante di punti (più eventuali punti bonus se vuoi allargare le dimensioni mangiando qualcosa) nella stringa nell'altro lato - cioè, il lato da B ad A. Se li inserisci ugualmente lungo la lunghezza e rendendoli più corti della distanza desiderata tra i punti, dovresti ottenere un piacevole effetto elastico-espansivo.
Penso che copra tutto. A proposito: l'idea sembra fantastica.