Animación de elementos 1-Dim (cuerdas) con MatLab

 

Hace poco publiqué un par de videos en los que mostraba algunas cosillas aprendidas sobre animación. Se trataba de animación basada en simulación de sistemas dinámicos, es decir, no simplemente mover cosas, si no que se muevan como se supone que se deberían mover por las leyes de la mecánica.

Aquello eran partículas, pero en este caso os presento un paso más allá en la complejidad del sistema a simular, los elementos de una dimensión, es decir, con forma de cuerdas.

Ahora voy a explicar un poco que limitaciones y problemillas tiene hacer un modelo matemático de una cuerda. Pero como comprendo que no a todo el mundo le puede interesar todo el aspecto matemático, puedes ir directamente al video del final.

 

Cuerda como partículas

 

Las cuerdas no dejan de ser al fin y al cabo un conjunto de partículas, pero que no son completamente independientes entre si. En una cuerda, cada partícula está (idealmente) rodeada únicamente por otras dos partículas, una a cada lado. Además de las fuerzas habituales que pueden ejercerse sobre las partículas que vimos en la otra entrada (colisiones con superficies, la gravedad…) también existen las fuerzas que se ejercen las partículas vecinas mútuamente.

El modelo matemático que se ha usado para representar esta nueva fuerza de una partícula con sus vecinas es el del clásico muelle que ha visto cualquier estudiante de mecánica. Ésta fuerza es proporcional a la distancia entre partículas, o mejor dicho, al incremento (o decremento) de la distancia respecto a la de equilibrio (la de equilibrio es aquella distancia entre partículas con la que no se ejercen fuerzas mutuamente).

Como deben cumplirse las leyes de Newton, estas fuerzas (la que hace una partícula sobre una vecina, y viceversa) deben ser iguales y de signo opuesto. La idea es muy intuitiva: si se separan dos puntos adyacentes de la cuerda, las fuerzas que actúan sobre ellas serán proporcionales a cuanto se separen y en el sentido en el que queden nuevamente en equilibrio. Lo mismo sucede si se acercan entre ellas, apareciendo una fuerza proporcional que las separa.

 

Limitaciones del modelo

 

Esto es un modelo de cuerda, no una cuerda real. Y como todos los modelos, son una aproximación a la realidad. ¿Como deberían ser los parámetros del modelo para que se pareciera lo máximo a la realidad? Para empezar, una cuerda real tiene tres dimensiones, no una, pero podemos considerar una cuerda ideal sin grosor. Este es el menor de los problemas, os lo aseguro.

Como hay que mantener algún parámetro que otro constante, porque si no las posibilidades serían infinitas, decidí fijar la longitud de la cuerda a un cierto valor (creo que 1, pero es lo de menos), y cambiar el número de puntos cambiando así también la distancia entre ellos. Podría haberlo hecho perfectamente al revés, haber fijado la distancia de equilibrio entre puntos de modo que hubiera cambiado la longitud de la cuerda al añadir o quitar puntos. Me gustaba más lo primero, ya que es más fácil de dibujar varias cosas si se mantienen las medidas fijas.

Si queremos que la cuerda parezca real, entonces debe tener cuantos más puntos mejor, o para ser más rigurosos, la “densidad” de puntos (puntos por cada unidad de longitud de la cuerda) debe ser lo mayor posible. Como la longitud de la cuerda está fijada, añadir puntos es equivalente a aumentar esa densidad.

Por otro lado, existe el parámetro que nos da la proporción de la fuerza entre partículas según cuánto se alarguen o acorten sus distancias, que a partir de ahora será llamado K. Éste parámetro K es en realidad una medida de la rigidez (o la elasticidad según se mire) de la cuerda. Si la K es pequeña, se deformará fácilmente la cuerda (elástica) mientras que si la proporción K es grande, para la misma fuerza sobre las partículas, la deformación será menor (rígida).

Una cuerda extremadamente rígida sería como una vara de cobre, que podría deformarse por flexión (doblarse hasta hacerse una anilla, por ejemplo) pero no longitudinalmente. Una cuerda elástica sería como una goma elástica, que puede deformarse longitudinalmente. Para conseguir lo primero se requeriría una constante K infinita, que no es posible implementar en un método numérico, el que se usa en un ordenador. Por lo tanto otra limitación es que la cuerda siempre va a ser algo elástica.

Ahora tenemos un problema: por un lado queremos cuanta más densidad mejor (que implica menor distancia entre puntos) y por otro lado también queremos cuanta mayor rigidez mejor, o al menos la suficiente para que  no parezca un chicle. Resulta que valores altos de K pueden desestabilizar bastante el sistema, puesto que cambios muy pequeños en las distancias implican fuerzas enormes, que actualizan velocidades enromes y posiciones desorbitadas, es decir, un caos total. Y esto es más probable que pase cuando la distancia entre partículas es corta, por que con un pequeño distanciamiento de éstas, pasan de estar en equilibrio a estar a distancias muchas veces mayores o menores en proporción. Así que vemos que son cosas contrapuestas, es decir, otra limitación más. Para solucionar esto lo que se ha hecho es básicamente probar (¡la ingeniería está llena de aproximaciones, pruebas y errores!) hasta que la rigidez y la densidad de puntos tengan valores, al menos a vista, que parezcan aceptables.

Un último detalle es que, un vez que dos partículas adyacentes se separan (o acercan), la oscilación que se produce no se detiene por si misma (a no ser que de la casualidad que nuevas fuerzas la detengan) de modo que es necesario poner un factor de amortiguamiento de la oscilación, para que las partículas no solo oscilen respecto al estado de equilibrio cuando ya no actúen fuerzas externas, si no que además tiendan a él.

 

Simulaciones

 

Después de probar lo básico, el dibujo y el modelo correcto de la cuerda, el objetivo era “ponerla a prueba” de alguna forma para comprobar si la mecánica era la parecida a una cuerda que conocemos por experiencia.

Lo primero que probé hacer es el movimiento de onda que se propaga a lo largo de la cuerda, cuando la haces oscilar de un extremo. para esta primera simulación se considera que la partícula del extremo de la cuerda que se hace oscilar no se ve afectado por el resto de puntos. Es como si tuvieras cogido ese extremo con la mano y no lo dejaras ir, obligándolo a hacer la oscilación. Cualquier frecuencia y amplitud de onda no eran adecuadas, fue necesario encontrar alguna que diera visualmente un buen resultado. En la que se ve en el video, todo va más o menos bien hasta llegar al final, donde aparece una resonancia un poco extraña. En esta simulación no hay gravedad.

La segunda simulación es la de una cuerda tendida, es decir, en la que se fijan los dos extremos, y que cae por gravedad. La apariencia elástica es intencionada, ya que así se pueden ver las distintas ondas que se forman. En un caso más rígido, la cuerda bajaría muy lentamente y no se formarían ondas, así que no era interesante. 

En la tercera simulación la cosa ya se pone más interesante, porque aparecen colisiones con superficies, en particular con el suelo y las paredes. Es básicamente el mismo problema que con partículas independientes, ya que el hecho de ser una cuerda no introduce muchos cambios en esto. En este caso la cuerda se pone vertical y se hace que el extremo siga una trayectoria circular, para producir los choques con las paredes.

Y por último, en la cuarta simulación probé algo más complicado, la colisión con superficies curvas. Aquí lo interesante era usar cilindros en lugar de esferas, como se hizo en el caso de partículas, porque mi intención era crear el efecto de cuerda que se enrolla en un tubo. El aspecto matemático de la colisión era aquí muy parecido al de la esfera. Como veis he usado dos gráficas en esta simulación porque en la vista cenital se comprueba mejor la colisión con el cilindro.

 

Animación de cuerdas con MatLab

 

Y hasta aquí las simulaciones con cuerdas. Si alguien quiere conocer algún aspecto concreto de las simulaciones o del código, que me lo pida sin problemas. Lo que no haré será pasar el código íntegro, pero si puedo responder a cuestiones sobre que funciones o ideas he usado.

Las siguientes simulaciones que presentaré próximamente serán las de superficies, es decir, elementos que parecen simular “ropa”. La complejidad es mayor pero el resultado es más espectacular si cabe.

 


Para entradas relacionadas, visita la colección Animación con MatLab.

8 comentarios

  1. Información Bitacoras.com…

    Valora en Bitacoras.com:   Hace poco publiqué un par de videos en los que mostraba algunas cosillas aprendidas sobre animación. Se trataba de animación basada en simulación de sistemas dinámicos, es decir, no simplemente mover cosas, si no que se mue…..

  2. […] programa. En la primera entrada mostré simulaciones de sistemas muy simples, las partículas. En la siguiente aumentamos la complejidad a elementos de una dimensión, es decir, tipo ‘cuerdas’. En esta […]

  3. Bueno, pero no compartio el codigo

  4. podrias ayudarme con el codigo necesito de urgencia porfavor

    1. No creo que pueda explicarte este código urgentemente, y tampoco lo comparto íntegro porque ese no es el objetivo del blog. El objetivo del blog es didáctico, y copiando el código no se aprende. Pero si deseas conocer soluciones concretas, no dudes en preguntar.

      Para la animación de cuerdas es necesario conocer un poco la animación de particulas primero. El truco en este caso es guardar las particulas de la cuerda en una matriz. Por ejemplo, si hay 5 particulas, entonces hay un vector con las 5 x, otro con las 5 y, otros con las 5 velocidades x-y, otro con las fuerzas…
      Y las fuerzas en cada paso se calculan como si entre dos particulas consecutivas hubiera un muelle. Es un poco largo de explicar aquí, quizas en el futuro haga un tutorial detallado.

      Saludos.

  5. hola.
    Mira estoy intentando hacer una cuerda con péndulos que tienen resortes en su cuerda, (una cuerda elástica), he intentado plantearla mediante métodos numéricos de esta manera:

    fs=10; tim=0:1/fs:8;
    k=0.2; m=0.5; g=-9.81; lo=1;
    f=@(t,y)([y(2);(g*(lo+y(3))*sin(y(1))-(2*lo*y(3)+(y(3))^2)*y(2))/(lo+y(3))^2;…
    y(4);(lo+y(3))*(y(2))^2+g*cos(y(1))-k*y(3)/m]);
    [t,y]=ode45(f,tim,[pi/2;0;0;0]);
    posx=(lo+y(3))*sin(y(1));
    posy=(lo+y(3))*cos(y(1));
    plot(t,y(:,1))

    Pero en resumen, básicamente no funciona jaja. Cuando llega al tiempo 7 mi partícula desaparece y no se comporta como debería. No sé si estoy total mete equivocado en el planteamiento, si puede ayudarme a encontrar un norte en este problema te lo agradecería.

    1. Si lo he entendido bien, lo que deseas es simular un péndulo, con una cuerda elástica con un peso en el extremo, ¿es eso? Es una simulación que puede resultar interesante.

      Lo que veo en el código es que el vector ‘y’ tiene 4 componentes, de las que he deducido que la primera es un ángulo, la derivada de ese ángulo es y(2). La tercera y la cuarta no sé qué son, pero también están relacionadas porque y(4) es la derivada de y(3). Pero no acabo de entender de donde salen las ecuaciones diferenciales de f. Sería genial si me explicaras un poco como son las variables que utilizas y las ecuaciones.

      En las simulaciones que yo he hecho y que aparecen en la entrada, voy calculando en cada paso la velocidad y la posición de todas las partículas de la cuerda. La velocidad cambia según dicta la aceleración (la fuerza), y la posición según dicte la velocidad. Y voy dibujando cada vez el resultado sobre el dibujo anterior.
      Lo que veo que haces tú es distinto. Tú calculas toda la trayectoria de un único punto (con el ‘ode45’) y luego la dibujas. Son cosas diferentes. El código que me has pasado dibuja y(1), que deduzco debe ser el ángulo del péndulo o algo así.

      Si quieres hacer una simulación como las que he hecho yo, debes guardar las posiciones, velocidades y aceleraciones de todos los puntos de la cuerda. Si es en 2 dimensiones, serán matrices 2xN, con N partículas. También deberás calcular la distancia entre partículas adyacentes, para con ello calcular la fuerza del ‘muelle’ en cada tramo entre dos partículas.

      Creo que lo mejor es empezar con un ejemplo sencillo (pocas partículas, sin gravedad, sin ningún peso en la cuerda…) y poner bien las condiciones iniciales, y luego irlo complicando poco a poco. Recuerdo que unos de los problemas que me surgieron a mí es que a veces los puntos adyacentes de la cuerda se me juntaban demasiado, o nunca paraban de oscilar. Por eso hay que añadir amortiguación a la fuerza de los ‘muelles’.

      Si tengo tiempo ya te lo miraré con más detalle. Espero que te sirva de algo. Si quieres saber alguna cosa más no dudes en preguntar.

      Un saludo.

  6. hola.
    me podrias decir que temas debo checar, para poder hacer tal simulacion?

¿Qué te parece?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: