Du haut de ma tête, la clause qui me vient à l'esprit est que vous voulez que la zone soit constante. Cela me semble être la douleur dans tout cela, alors essayons de trouver une solution facile à cela.
Prenez un morceau de ficelle et attachez les extrémités pour former un cercle. Je peux me tromper, mais mon intuition dit que l'intérieur de cette chaîne a une zone constante, ou agirait énormément comme votre limite d'amibe.
Je dirais donc: implémentez la chaîne. ;) La plupart des bibliothèques de physique peuvent faire des ressorts (dans Box2D, cela ressemble à l'articulation de distance), et la façon la plus simple de créer une chaîne est de connecter de nombreuses chaînes ensemble. Rejoignez le dernier jusqu'au premier pour créer une boucle. Assurez-vous que les ressorts de la chaîne ont une constante de ressort suffisamment élevée pour ne pas être étirés - vous voulez qu'ils soient assez rigides et bougent à l'unisson, pas pour s'étendre.
Ensuite, créez des forces pour agir sur la chaîne. Trivialement, vos deux noyaux / yeux / points de contrôle créent des forces sur les points qui composent la chaîne. Faites tomber la force avec une fonction de carré inverse:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
Et éloignez la direction de la force directement de l'œil / balle de contrôle, comme une force répulsive émanant de la balle. Tweak K pour contrôler la force de la force. Assurez-vous que K n'est pas trop haut - vous ne voulez pas qu'il soit simplement poussé massivement par la force, tenez-le simplement à l'écart des balles. Laissez beaucoup de mou dans votre chaîne.
Avec juste ces deux-là, vous vous retrouverez probablement avec une forme assez uniforme, donc je vous suggère également de créer des forces plus faibles autour de la `` soupe '' environnante pour changer la forme de l'amibe. Vous pouvez créer ces endroits aléatoires, changer régulièrement leur force (vous pouvez en faire une fonction sinusoïdale pour de beaux mouvements) et les faire fonctionner de la même manière que les balles.
Vagination (fnarr): c'est la plus difficile. Vous le faites envelopper un objet en vérifiant si deux points non adjacents sur la chaîne ont réussi à se rapprocher suffisamment, et si c'est le cas, vous devez:
Mesurez la distance entre les points de la chaîne. Comptez le nombre de sections de ressort. Trouvez le chemin «le plus court» de A à B.
Brisez la chaîne et rejoignez-la avec les deux points adjacents. En d'autres termes, joignez directement le point A au point B et jetez toutes les choses entre les deux.
Réinsérez le nombre de points manquants (plus les points bonus si vous souhaitez augmenter la taille en mangeant quelque chose) dans la chaîne de l'autre côté - c'est-à-dire le côté de B à A. Si vous les insérez également sur la longueur et les rendre plus courts que la distance souhaitée entre les points, vous devriez obtenir un bel effet élastique et extensible.
Je pense que cela couvre tout. Au fait: l'idée semble géniale.