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
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.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Jonatan el 22 de Junio de 2007
Por HernanRivas el 22 de Junio de 2007
Fuera de eso, el portal de matemática o de algoritmos de Wikipedia es excelente al igual que la página de Wolfram.
Los links están en inglés, pero eso se debe a que, en general, hay más información en esos idiomas.
Por Señor Oz el 22 de Junio de 2007
Excelente tutorial, Señor Hernan.
Por jonatan el 05 de Julio de 2007