Motores Físicos

Experimentación con el sólido rígido, conservación del momento angular, y empleo de primitivas de la librería física de gráficos de java.

Actividad 1
En esta actividad se trata de instanciar objetos que están sometidos a contacto unos
con otros y por tanto existen fuerzas de fricción, además de la fuerza peso. Se simula un conjunto de cubos apilados unos encima de otros. El motor físico genera las interacciones entre los cubos. 


Actividad 2
En esta actividad se pretende comprobar que el motor físico utilizado es capaz de
simular la conservación del momento angular entre dos cuerpos que están conectados con
una varilla rígida de distancia variable. El momento angular de dos cuerpos que giran solidariamente alrededor de un centro de masas se conserva si no actúan fuerzas externas.

Esto se traduce en que el producto del tensor de inercia del cuerpo en cada instante por su velocidad angular se mantiene constante ( 𝐼(𝑡1) 𝑤(𝑡1) = 𝐼(𝑡2) 𝑤(𝑡2) ). Si la configuración del cuerpo cambia (como ocurre con dos cuerpos unidos por una barra rígida cuando ésta cambia de longitud), la velocidad angular del sistema cambia para mantener el producto constante. Esto es lo que ocurre con los patinadores cuando están rotando sobre sí mismos y abren y cierran sus brazos.


En esta actividad vamos a representar a un sistema de sólido rígido formado por dos
esferas solidarias. Para unir las dos esferas necesitamos hacer uso de las uniones (joints), que son elementos básicos de construcción de las escenas en los motores físicos. La velocidad angular del sistema cambia al variar la distancia entre los objetos al hacer click con el ratón.


Actividad 3

Simulación de 3 molinillos de viento, cada uno formado con 2 esferas y un centro de gravedad como los de la actividad 2.

Tema 1 – Bubble Shooter

Simulación de un Bubble shooter sencillo.

-Problema planteado: Hacer un ’buble-shooter’ sencillo. Para ello, se simulará un lanzador de bolas con velocidad constante.

El disparo es lanzado según la posición recogida del ratón al hacer click sobre la pantalla de simulación. La pelota seguirá la trayectoria definida por esta posición. 

La velocidad será constante durante el disparo, por lo que la aceleración siempre es nula.

Tiro Parabólico

Ejercicio: Simular un tiro parabólico (velocidad inicial v, gravedad g y masa m) con los distintos métodos de integración estudiados en clase, y compararlos para averiguar el error cometido.

Se ha realizado una demostración del tiro parabólico, primero con cada método de integración por separado, y a continuación con todos a la vez. En este último caso, podemos apreciar la diferencia entre cada método.

Además, se ha añadido un coeficiente de restitución que permite calcular el rebote. Si su valor es un, el rebote será igual siempre que el primer lanzamiento (no  habrá pérdida de energía). Si el valor es 0, no habrá rebote. Si el valor se encuentra entre 0 y 1, como es el caso del vídeo, la energía se irá progresivamente perdiendo, hasta alcanzar valor nulo en el último rebote.

Tema 1 – Plano inclinado + Muelle

Ejercicio: Simulación de un muelle sobre la superfície de un plano inclinado.

Consideraciones del plano inclinado: 

        -El peso se descompone en normal y tangencial al plano de movimiento (en
        este caso inclinado).

       -Rozamiento (fricción): f = −kv. Se opone al movimiento.     

         F = mgsin(30º) − f

Consideraciones sobre el muelle: 

        -La fuerza proporcional al desplazamiento (ley de Hooke)

         Fk = ks (Lactual − Lreposo) − kd vmuelle (modelo de amortiguación).

Tema 1 – Montaña Rusa

Simulación del efecto montaña rusa.


-Problema a resolver:  Simular el movimiento de una partícula que se
mueve a tramos de velocidad, con pendientes distintas en cada tramo y
velocidades en funci´on de las pendientes.

Hay velocidades y aceleraciones diferentes para cada tramo, lo que dota al ejercicio de mayor dinamismo.

Tema 1 – Burbuja

Burbuja simulando la ascensión a la superfície desde el fondo del mar.

Planteamiento del problema: Una burbuja de aire se desprende desde el fondo del mar y se eleva a la superficie. La aceleración de la burbuja viene determinada por la flotabilidad y el arrastre viscoso del agua, siendo la ecuación que descrive la aceleración: 
a = 80 − 16v(pies/s^2)

o bien:

a = 24,384 − 4,8768v(metros/s^2)

Mediante el método de integración Euler explícito y a partir de la aceleración en cada tramo, se ha obtenido la velocidad y la posición para cada tramo.

Simulación de olas mediante mapas de altura

Simulación de distintas olas mediante el empleo de mapas de altura.

MAPA DE ALTURAS: Sistema para simular olas de mar mediante ondas periódicas, formado por una matriz de puntos, la altura de los cuales será el mapa de alturas del sistema. Dichos puntos serán la amplitud de la onda en cada instante.
Se calcula un vector de dirección distinto en cada caso, y se actualiza los vértices de la malla dependiendo del tipo de onda escogido. En el caso de las ondas radiales y sinusoidales tan solo modificamos la componente z de los vértices, mientras que en el modelo de Gerstner se modifican las componentes x, y, z ya que en este caso se devuelve un punto. Para simular el comportamiento de los tres tipos de ondas juntas crearemos
un vector sumatorio de ondas, y se devolverá un punto al igual que en Gerstner salvo que en este caso la componente z estará compuesta también por la suma entre el cálculo de la onda radial más la sinusoidal.

A = amplitud de la onda
k = número de onda = 2·pi/longitud de onda
w = frecuencia angular = 2·pi/periodo
t = tiempo
s = distancia al centro e la perturbación
D = dirección de propagación
Q = Constante de encrespamiento de la ola.

Direccional (Sinusoidal): Ondas en un sentido. Estas ondas simulan olas oceánicas. La simulación del sistema no conlleva desplazamiento de materia, por lo que su objetivo es más visual que empírico. Desde un punto arbitrario fuera de la malla, las perturbaciones van siendo generadas con amplitud, velocidad, dirección y longitud de onda constantes.
A medida que avanzamos en cada diferencial de tiempo, los frentes de las ondas van recorriendo la malla en función de la dirección unitaria preestablecida, que será la misma para todos los puntos de la malla.

z = A·cos(D·(x, y)·k + wt) 

Radial: Ondas circulares a partir de un centro. Al tratarse de la simulación de la
perturbación física superficial producida sobre un fluido, vamos a trabajar con un mapa de alturas, lo que no conlleva desplazamiento de materia, por lo que tiene claramente un objetivo más visual que empírico. Desde un punto de origen, la perturbación nace con una amplitud inicial, velocidad inicial y una longitud de onda predefinidas. A medida que avanzamos en cada diferencial de tiempo, la perturbación va afectando a los puntos
de la malla que distan del origen según la relación tiempo transcurrido y velocidad de propagación de la onda, y a su vez va viéndose afectada en una atenuación de su amplitud.

z = A·cos(k·s – w·t) 

Gerstner: Aquí se modifica la altura del vértice y la posición en el plano XY, pues están pensadas para simular mar de fondo, donde hay un sumatorio de ondas longitudinales, cada una de ellas con una dirección diferente y incluyendo diferentes parámetros de caracterización. Este tipo de ola supone transporte de materia por lo que se deben modificar las tres coordenadas del punto en cada iteración. Las olas se cruzan entre sí, generando puntos cercanos con alturas que cambian. Para este caso de mares más picados, debemos conseguir que las crestas de las olas se muevan y rompan sobre la superficie según la energía que transporten. Mediante Q, generamos la rotación de la ola con la que rompe sobre la superficie, en función inversamente proporcional a la frecuencia y a la amplitud.

x = x0 + Sumatorio(Q·A·Dx·cos(D·(x, y)·k + wt))
y = y0 + Sumatorio(Q·A·Dy·cos(D·(x, y)·k + wt))
z = Sumatorio(Q·A·Dy·cos(D·(x, y)·k + wt))

 

A continuación, se muestra un fragmento de código que muestra cómo se han parametrizado cada uno de los tipos de olas:

switch(mode){
case RADIAL:
res.z = A * sin(k * src_dir.dist(punto) – phi * t);
break;
case DIRECCIONAL:
src_dir.normalize();
res.z = A * sin(k * PVector.dot(src_dir,punto) + phi * t);
break;
case GERSTNER:
src_dir.normalize();
res.x = Q * A * src_dir.x * cos(k * PVector.dot(src_dir,punto) + phi * t);
res.y = Q * A * src_dir.y * cos(k * PVector.dot(src_dir,punto) + phi * t);
res.z = A * sin(k * PVector.dot(src_dir,punto) + phi * t);
break;

}

Tema 2 – Fuente

Simulación de un surtidor de agua de la Fontana di Trevi.

Emisor de partículas que recrea una fuente mediante un surtidor de partículas. Todas las partículas parten desde un punto inicial, y a partir del mismo cada una describe una trayectoria diferente en función de un ángulo de partida. 

El radio será aleatorio, y la gravedad positiva. 

Este fragmento de código describe la forma (imagen) que describirán las partículas del surtidor:

Particle(PVector l) {
        i++;
        angle = -(60+10*(i%7)) * PI/180.0;
        acceleration = new PVector(0, 0.06);
        velocity = new PVector(cos(angle)*4, sin(angle)*6);
        location = l.get();
        lifespan = 200;
}

Tema 4 – Velocidad Angular

Esfera desplazándose con velocidad lineal y angular

El objetivo es simular el movimiento de una esfera de manera que se mueva con
una velocidad lineal v(t) y que gire lo necesario para no producir sensación de deslizamiento sobre el suelo. Para ello, se ha debido calcular la velocidad angular que evita que se produzca dicho deslizamiento.

El siguiente sistema de ecuaciones nos muestra la solución para este problema:

(v(t) + w(r) x r = 0)

Para lograr evitar el deslizamiento, forzaremos al sistema para que la velocidad del punto de contacto de la esfera con el suelo sea 0 (nula) en ese punto.

En el primer caso, la esfera se desplaza sobre una superficie situada por encima de ella, mientras que en el segundo caso la superfície se encuentra por debajo.


En el vídeo se alterna entre el primer y el segundo caso, y se ajusta velocidad lineal para ralentizar o acelerar el movimiento de la esfera. 

Grid y Hash

Colisiones entre partículas con distintos métodos.

Se simula la colisión entre partículas y con las paredes interiores de una probeta donde se encuentran contenidos. Para ello, se estudian colisiones basadas en muelles y en velocidades. Además, se emplean dos estructuras de datos para mejorar la eiciencia del sistema:

Grid→Repartimos el espacio en un conjunto de celdas de igual tamaño, e introducimos la partícula en una determinada celda según su posición. Compruebo la colisión con las partículas de mi celda y con las de las celdas vecinas. El problema es que desaprovechamos mucho espacio, ya que existen celdas vacías.

Hash→Los datos se almacenan en una tabla dispersa (vector de tamaño doble que el total de elementos a guardar). Las partículas se almacenan aplicando una función de dispersión, que nos dará una posición en la tabla. Esto nos servirá para encontrar partículas vecinas a una dada, y podremos calcular las colisiones sólo con las partículas que a priori sé con las que puedo chocar, es decir, con las de mi propia celda.

Vamos a comprobar las colisiones partícula contra partícula y partícula contra plano en ambos métodos.