Alice 3.1 – Movimiento de caida libre con rebote

En esta ocasión he intentado simular el movimiento en caida libre de un objeto utilizando las ecuaciones para la caida libre y el tiro vertical (la imagen ha sido tomada de esta página de la web fatela.com.ar

CaidaLibre2

El resultado es un proyecto en el que se deja caer y rebotar un objeto volleiball, tratando que la simulación se vea lo más fluida posible.

CaidaLibre1

Solamente se deja caer la pelota desde una altura de 5m y se mira como rebota. El proyecto es este:

MovimientoCaidaLibre.a3p

 

Descripción del proyecto

Consta de los objetos volleiball, axes y textModel, y lo único que hace es llamar a un procedimiento llamado CaidaLibre:

CaidaLibre3

NRebotes es el número de rebotes que va a dar la pelota

NIntervalosPorCaida es el número de sucesivas posiciones en las que se va a diburar la pelota para dar el efecto de movimiento

AlturaInicial: la he fijado a 5m.

Rapidez: un valor para el parámetro duración de las sentencias MOVE

 

El procedimiento CaidaLibre es el que dibuja la pelota en las distintas posiciones para simular el movimiento. La parte principal es un bucle hecho con una instrucción COUNT (que cuenta NRebotes) donde cada recorrido se compone de dos partes: una de caida libre y otra del movimiento de rebote, que viene a ser un tiro vertical. A su vez, cada una de ellas es otro bucle COUNT que cuenta NIntervalosPorCaida) donde está situada la instrucción MOVE que va simulando el movimiento.

Al principio probé dejando todo el cálculo de las magnitudes (tiempos, velocidades y alturas) dentro de esos bucles, pero el resultado no era del todo fluido ya que, sobretodo al comienzo de la caida libre, había un instante de ralentización cortando la continuidad del movimiento. La solución fue crear un array donde ir almacenando los cálculos (con otro bucle COUNT) y recuperarlos posteriormente al realizar los bucles descritos antes. Al tener que utilizar un array me encontré con el problema de que Alice no tiene (o al menos no la he encotrado) una manera dinámica de dimensionar el array, de tal forma que hay que definir previamente todos los valores antes de poder comenzar a utilizarlo.

Merece la pena explicarlo con detenimiento: Al crear un array, cuando pulsamos en el Initializer se abre la ventana Custom Array para que metamos los valores en el array. En este caso 0,1, y 2.

CaidaLibre4

Al darle OK el resultado es el siguiente

CaidaLibre5

También es posible crear el Array vacío dandolo a OK en la ventana CustomArray sin haber introducido previemente los valores 0,1, y 2

CaidaLibre6

Ha creado el array sin inicializar los valores, pero no ha dejado que podamos dimensionarlo introduciendo algún valor entre los corchetes (los corchetes, no las llaves). Cada vez que se intente introducir un valor en el array mediante alguna sentencia nos dará error.

CaidaLibre7

 

 

 

CaidaLibre8

 

 

 

 

 

 

 

 

 

Lo ideal sería que el array se pudiese dimensionar de manera dinámica según los valores de los parámetros NRebotes y NIntervalosPorCaida y del procedimiento CaidaLibre, pero parece que desde Alice no es posible. La solución es bastante trabajosa y consiste en inicializar a mano todos los valores del array que se necesiten, pero estamos hablando de más de un centenar.

Siguiendo con la descripción del procedimiento CaidaLibre, éste también utiliza varias funciones construidas previamente para hacer los cálculos:

CaidaLibre_CalculaTiempoParcial

 

 

 

 

 

 

CalculaVelocidadFinal

 

 

 

CaidaLibre_CalculaAltura

 

 

 

 

 

 

 

CalculaTiempoParcial es utilizada para saber cuanto tiempo va a llevar la siguiente caida libre o tiro vertical con objeto de dividirlo posteriormente entre el parámetro NIntervalosPorCaida y calcular el tiempo que pasa entre cada “fotograma” dibujado con  MOVE.

CalculaVelocidadFinal se usa para saber con qué velocidad inicial comienza cada tiro vertical, que será igual a la velocidad final de la caida libre anterior multiplicada por un coeficiente de elasticidad del rebote. Este coeficiente debe tener un valor entre 0 (no rebota) y 1(rebota indefinidamente).

CalculaAltura se usa en los bucles internos que preparan cada instrucción MOVE, para saber dónde tiene que dibujar la pelota en cada momento

 

También hay dos constantes definidas como propiedades a nivel scene, que son:

CaidaLibre9

Por último, se ha añadido un objeto textModel anclado a la pelota con la propiedad vehicle para informar de la altura de la pelota en cada momento.

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: