Animación de elementos 2-Dim (ropa) con MatLab

 

Ésta es la siguiente (y probablemente última) entrada de la colección Animación con MatLab, en la que muestro algunas cosas que he aprendido sobre simulación usando dicho 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 última veremos algunas cosillas que hice con elementos de dos dimensiones, lo que podría simular el comportamiento de algo como la ropa.

 

En la entrada de los elementos tipo ‘cuerda’ comenté todas las dificultades añadidas con respecto a las partículas, tanto por las limitaciones del modelo (de no representar la realidad fielmente) como de las matemáticas. Esta vez no me voy a extender mucho porque las dificultades son básicamente las mismas con las superficies. Me limitaré a hacer una descripción del nuevo modelo y el tipo de fuerzas que ahora intervendrán.

Si en el caso de las cuerdas podíamos pensar que éstas se generaban como una sucesión de partículas, las superficies pueden generarse como una sucesión de cuerdas. Una superficie ideal (imaginad una sábana ondeando al viento y congelada un instante en el tiempo) podemos pensar que contiene infinidad de ‘cuerdas’ unas junto a las otras infinitesimalmente cercanas.

 

Modelo

 

Como también comenté en la entrada anterior, hacer un modelo matemático de algo ideal, y más aún si vamos a utilizar métodos numéricos, siempre nos obliga prescindir de la idea de infinito. Nuestra infinidad de cuerdas será un número determinado y su proximidad tan alta como se quiera, pero siempre atendiendo a los posibles problemas numéricos.  Es decir, que en realidad tendremos una red (o malla) de partículas que representarán una superficie con zonas siempre planas, las que forman las partículas adyacentes. Estos planos pueden ser cuadrados o triángulos, como suele ser habitual. En mi caso es una malla cuadrada.

Como pasaba con las cuerdas, las partículas que forman la superficie no son completamente independientes las unas de las otras. Cada una tiene, localmente, otras 4 partículas vecinas arriba, abajo, a la izquierda y a la derecha. Para una primera aproximación podría ser suficiente con tener en cuenta solo 4 partículas vecinas, pero si se quiere más ‘realismo’, sería necesario considerar también las 4 que se encuentran en la diagonal.

 

image

 

Las fuerzas que actúan entre ellas son como en las cuerdas, como si un muelle (con amortiguación para que no oscilen indefinidamente) las uniera. Si se separan de la distancia de equilibrio, aparece una fuerza que actúa sobre cada una de igual magnitud y signo contrario, haciendo que se acerquen, y si se acercan en primer lugar sucede al contrario.  Estas fuerzas representan físicamente cosas distintas según qué partículas vecinas consideremos.

Empecemos por las 4 más cercanas, las marcadas de color rojo en la imagen anterior. Las fuerzas entre estas partículas y la central tienen la misma función que en el caso de la cuerda, evitar que las partículas se alejen o acerquen demasiado localmente. De esta forma se consigue en la medida de lo posible (en la entrada anterior explico el por qué) que no parezca un material demasiado elástico. Estas 4 fuerzas, en cambio, no son suficientes para lograr un buen resultado en el caso de la ropa. Fijaos en que no podemos evitar que las verdes se acerquen demasiado a la central, o que la atraviesen, si no ponemos una fuerza entre ellas. Incluso aunque mantengamos la distancia entre las rojas y la central, se pueden formar rombos muy aplanados.

Este segundo grupo de fuerzas entre la central y las verdes representarían la resistencia a la cizalla, de forma que la ropa no solo no debe ser demasiado elástica a la tracción, si no que tampoco a fuerzas tangenciales de signo opuesto. Con esto ya sale algo decente, pero aún podría mejorarse si consideráramos las que están una posición más allá de las rojas, considerando así la resistencia a la flexión. En las simulaciones que he hecho he usado las 8 primeras partículas adyacentes.

 

Simulaciones

 

He hecho varias simulaciones similares en las que solo cambia el número de partículas. Resulta que cuantas menos partículas, menos tiempo de cálculo y se produce un movimiento más rápido y suave. Es decir que se ve mejor. Pero claro, para que no parezca demasiado ‘troceada’ la superficie y las ondas que se formen tengan una curvatura suave tiene que haber más partículas, por eso he hecho de los dos tipos.

En las dos primeras se hace oscilar los dos extremos superiores en una sola dirección, y después se hacen girar para ver el efecto. Esto siempre con gravedad, para que la ropa ‘caiga’ y sea más natural, y con colisión con el suelo.

En las dos últimas estuve probando las colisiones con esferas, que es relativamente fácil si haces colisionar las partículas solamente. Otra cosa más complicada hubiera sido la colisión entre superficies.

 

 


Esta entrada pertenece a la colección  Animación con MatLab.

4 comentarios

  1. Información Bitacoras.com…

    Valora en Bitacoras.com:   Ésta es la siguiente (y probablemente última) entrada de la colección Animación con MatLab, en la que muestro algunas cosas que he aprendido sobre simulación usando dicho programa. En la primera entrada mostré simulaciones …..

  2. Hola, muy buen aporte. En que modelo te basas? La simulación la realizas con el comando surf? Gracias y felicidades por tu blog!

    1. Lo tengo un poco olvidado y te lo tendría que mirar bien, pero el modelo consiste en considerar las fuerzas que recibe cada partícula de las que tiene alrededor. la fuerza resultante es la suma vectorial de esas fuerzas. Puedes considerar solo las 4 adyacentes, o las 8 más cercanas. He revisado mis códigos y hice uno que consideraba hasta 12 puntos adyacentes! Pero es una locura de cálculo, así que te aconsejo empezar por 4.

      Para dibujar sí uso la función surf. Concretamente la parte es esta:
      ————————-
      surf(bc.x(:,:,1),bc.x(:,:,2),bc.x(:,:,3));
      axis([-2 2 -2 2 -1.5 1.5]);
      title([‘step : ‘ num2str(step)]);
      grid
      drawnow;
      pause(0.001);
      clf;
      ————————–

      bc es una clase. x es una propiedad de esa clase (hay otra para la velocidad y otra para la fuerza). En x guardo todos los puntos con sus 3 coordenadas. Imagínatelo como una matriz en 3D de dimensión NxMx3. con N filas, M columnas y tres componentes para cada punto.
      Espero que te sirva.

      Un saludo

  3. Diego Castro · · Responder

    Hola, me gusto mucho tu simulación de la ropa y la cuerda, te quiero preguntar si es posible que muestres el código fuente por correo electrónico o de alguna forma, es que me gustaría jugar un poco y si puedo añadirle algún elemento interesante adicional, de antemano muchas gracias por tu atención

¿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: