Fuera de mi cabeza, la cláusula que me llama la atención es que quieres que el área sea constante. Eso me parece el dolor en todo esto, así que tratemos de encontrar una solución fácil para eso.
Tome un trozo de cuerda y ate los extremos para formar un círculo. Puedo estar equivocado, pero mi intuición dice que el interior de esa cuerda tiene un área constante, o actuaría de manera muy parecida a su límite de ameba.
Entonces diría: implementar la cadena. ;) La mayoría de las bibliotecas de física pueden hacer resortes (en Box2D se parece a la unión de distancia), y la forma más fácil de hacer una cadena es conectar muchas cadenas juntas. Únete al último hasta el primero para crear un bucle. Asegúrese de que los resortes en la cuerda tengan una constante de resorte lo suficientemente alta como para que no se estiren; desea que sean bastante rígidos y se muevan al unísono, no se expandan.
A continuación, cree fuerzas para actuar sobre la cadena. Trivialmente, sus dos núcleos / ojos / puntos de control crean fuerzas sobre los puntos que forman la cadena. Haz que la fuerza se caiga con una función de cuadrado inverso:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
Y haga que la dirección de la fuerza se aleje directamente del ojo / bola de control, como una fuerza repelente que emana de la bola. Ajusta K para controlar la fuerza de la fuerza. Asegúrate de que K no sea demasiado alto: no quieres que la fuerza lo expulse masivamente, solo mantenlo alejado de las bolas. Deje mucha holgura en su cuerda.
Con solo esos dos, probablemente terminará con una forma bastante uniforme, por lo que también le sugiero que cree algunas fuerzas más débiles en la 'sopa' circundante para cambiar la forma de la ameba. Puede hacer estos lugares aleatorios, cambiar su fuerza regularmente (podría hacer que sea una función sinusoide para movimientos agradables) y hacer que funcionen de la misma manera que las bolas.
Vaginación (fnarr): esta es la difícil. Puede hacer que envuelva un objeto verificando si dos puntos no adyacentes en la cadena han logrado acercarse lo suficiente, y si es así, necesita:
Mida la distancia entre los puntos en la cuerda. Cuente el número de secciones de primavera. Encuentre el camino 'más corto' de A a B.
Rompa la cuerda y vuelva a unirla con los dos puntos adyacentes. En otras palabras, une directamente el punto A al punto B y descarta todas las cosas intermedias.
Vuelva a insertar el número faltante de puntos (más los puntos de bonificación si desea ampliar su tamaño al comer algo) en la cuerda en el otro lado, es decir, el lado de B a A. Si los inserta por igual a lo largo y hazlos más cortos que la distancia deseada entre puntos, deberías obtener un agradable efecto elástico y expansivo.
creo que lo cubre todo. Por cierto: la idea suena increíble.