Para comenzar este tip recomendaría ciertos conocimientos de trigonometría básicos. Especialmente, los requeridos para mover un objeto a cierta velocidad en un ángulo determiado.
Bien, vamos a suponer un punto que se mueve en nuestra pantalla con un ángulo constante. Debería ser bastante obvio que se puede pre-calcular el seno y coseno del ángulo, almacenarlos en variables y acceder a ellos en lugar de calcularlos en cada fotograma. En caso de que el ángulo varíe en sólo ciertas ocasiones (rebotes, por ejemplo), las trigonométricas las calculamos sólo cuando varía el ángulo.
Ahora, vamos a ir un paso más allá y suponer que la velocidad es también constante. En este caso no sólo podemos pre-calcular las trigométricas, sino también el producto de éstas con la velocidad y obtener así cuánto se mueve un punto en cada instante o fotograma.
Para aquellos a los que esto no les resulte obvio, el siguiente código les va a aclarar el asunto:
Código :
MovieClip.prototype.punto = function (angMov:Number, velocidad:Number) {
var xstep = velocidad * Math.sin (angMov);
var ystep = velocidad * Math.cos (angMov);
this.onEnterFrame = function () {
this._x += xstep;
this._y -= ystep;
};
};
En este momento ya nos acercamos bastante a la idea de la Integración de Verlet.
En realidad, la integración de Verlet es (como bien sugiere el nombre) una manera de calcular integrales. Por suerte, como muchas otras herramientas matemáticas, tiene otros usuos. En este caso, vamos a aplicar este método para calcular la trayectoria de partículas cuando tenemos intervalos de tiempo discretos y uniformes, lo que en español significa intervalos iguales e indivisibles; es decir, fotogramas.
Cómo calculamos la trayectoria? Bien, podemos generalizar el ejemplo inicial, simplemente afirmando que en cada intervalo de tiempo (fotograma de aquí en adelante) la partícula (MC de aquí en adelante) se mueve en cada eje una distancia igual a la diferencia entre su posición actual y la anterior.
En el ejemplo anterior, esta diferencia es igual a las variables xstep y ystep.
Vamos a reescribir el ejemplo anterior usando esta técnica:
Código :
MovieClip.prototype.punto = function (x1:Number, y1:Number, x2:Number, y2:Number) {
// Variables que almacenan la posición actual de forma temporal
var xtemp, ytemp;
// Aceleración en el eje x e y. En este caso, ay es la gravedad
this.ax = 0;
this.ay = .3;
//
var xprev = x1;
var yprev = y1;
this._x = x2;
this._y = y2;
//
this.onEnterFrame = function () {
// Proceso de integración
xtemp = this._x;
ytemp = this._y;
this._x = 2 * this._x - xprev + this.ax;
this._y = 2 * this._y - yprev + this.ay;
xprev = xtemp;
yprev = ytemp;
};
};
Es innegable que a primera vista parecees más complicado. Si lo analizamos, usa más variables que el ejemplo anterior, las trigonométricas no se evitan, ya que, con el fin de obtener el mismo efecto, hay que ingresarlas como parámetros a la función e, incluso, este ejemplo necesita más cuentas y más código para hacer exactamente lo mismo.
Pero no hace exactamente lo mismo. Hay una gran diferencia y es que si cambiamos la posición del MC desde "afuera", automáticamente va a adaptar su movimiento a esta situación (que es a donde queríamos llegar).
En este momento el lector se estará preguntado si tanta complicación vale la pena y si el motivo de este tutorial es demostrar que emplear el método de Verlet es la peor manera de trabajar. Pues NO. Hasta tal punto es útil esta manera de hacer las cosas que todos los moteres de física la emplean (leer la aclaración del próximo párrafo), como Havok (el motor detrás del Max Payne 2 y, más recientemente HL2).
Aclaración: ésta es solo la aplicación más básica de la fórmula de Verlet. Hay muchas otras maneras de implementarlo, aunque no voy a considerar ninguna de ellas (son más complicadas y, aunque más precisas, nos complicarían inútilmente).
Pero aún puede no resultar claro porqué usar éste método.
Lo que ocurre es que este sistema permite agregar constraints o limitaciones de la manera más simple posible.
Y los constraints son necesarios cuando se quiere implementar física con cuerpos extensos.
Porqué? Bien, aunque desarrollo el tema con más profundidad en los próximos tutoriales, adelanto que luego de satisfacer los distintos constraints, hemos modificado la posición de los MCs. La Integración de Verlet se va a encargar de mover los MCs en consecuencia (esto significa que el cuerpo extenso se desplazará y rotará de acuerdo a los golpes) y nos hemos ahorrado un montón de trabajo.
Luego de éste tutorial, continuamos con los Constraints.
Disclaimer: quiero aclarar que el motivo por el que no presento ningún ejemplo de funcionamiento (.swf) es simplemente lo poco interesante que resulta ver una pelotita movíendose. Confío en que cualquiera que esté interesado, puede armar un ejemplo en pocos minutos.
HOla como estas, la verdad que no se nada de trinogometria y esas cosas que me recomiendas si es posible para comenzar con esto de fisica en flash, me podrias recomendar algun link donde aprender principios matematicos para hacer este tipo de magia con flash? muchas gracias, intento dejar de ser un mediocre que funde escenas con opacidad y solo usa condicionales logicos y bucles, quiero profundizar y esto que indicas me parece mi camino... gracias! y envidio la capacidad que tienes para saber esto. Gracias Totales por el aporte! Por:Jonatan_blog
Al principio hay un link sobre trigonometría básica en Flash.
Los links están en inglés, pero eso se debe a que, en general, hay más información en esos idiomas. Por:HernanRivas
ho ho, a mi tambien me interesa sobremanera aprender todo lo relacionado no solo con la trigonometria, sino con las matematicas en general, debido a que no me aplique mucho en la escuela,(jaja, si, lo se, ahora es cuando me recomendaran darme de topes en la pared) Pero se dice que nunca es tarde para aprender, aunque comienzo a creer que para esto puede que si lo sea. Se ingles, pero supongo que solo un 20 o 30 % (si no es que menos), y temo que si en mi idioma natal en ocasiones no entiendo de estas cosas, en ingles pues menos. Si alguien sabe de un link similar a los que puso el gran señor HernanRivas pero en español, pido de favor que lo reporte de inmediato, muchos, pero especialmente yo, quedaremos profundamente agradecidos. Excelente tutorial, Señor Hernan. Por:Señor Oz_blog
muchas gracias leyendo... cuanto que aprender!!! Por:jonatan_blog