domingo, 8 de marzo de 2009

De vuelta en casa y curvas.

Ahora vivo en mi propia casa. Una cosa en la lista menos :)

Desde hace mucho tiempo siempre quise hacer una cosa en mis animaciones: curvas. Siempre he querido hacer que un sprite se mueva como en las presentaciones de los juegos de CAPCOM o SNK. La foto de un luchador haciendo pose que viene desde fuera de la pantalla a mucha velocidad y suavemente se coloca en la en su posición.
Para conseguier este efecto primero pensé en utilizar tablas de senos y cosenos para añadir un modificador a una funcion lineal simple. Pero siempre que lo intenté implementar, ni siquiera conseguí compilar.
Desde hace un tiempo tengo este libro de matemáticas para juegos. En uno de los capítulos, tras unas sesudas demostraciones matemáticas, enseña las fórmulas que describen cómo hallar un vector que interpola otros cuatro que describen el punto inicial, final y dos modificadores. En otras palabras, curvas Hermite y Beizer:


claseVector2D curvaHermite(Uint32 tInicial, Uint32 tFinal, Uint32 tAhora, claseVector2D p1, claseVector2D p2, claseVector2D t1, claseVector2D t2){
claseVector2D H(0,0);
if ((tAhora > tFinal)||(tAhora < tInicial)) return H;
double t=(double)(tAhora-tInicial)/(double)(tFinal-tInicial); // t es un valor entre 0 y 1
//printf("%f , %d, %d, %d\n",t,tInicial,tFinal,tAhora); // debug
H=((1-(3*t*t)+(2*t*t*t))*p1)+(((t*t)*(3-2*t))*p2)+(t*((t-1)*(t-1))*t1)+(((t*t)*(t-1))*t2);
return H;
}

claseVector2D curvaBeizer(Uint32 tInicial, Uint32 tFinal, Uint32 tAhora, claseVector2D p0, claseVector2D p3, claseVector2D p1, claseVector2D p2){
claseVector2D B(0,0);
if ((tAhora > tFinal)||(tAhora < tInicial)) return B;
double t=(double)(tAhora-tInicial)/(double)(tFinal-tInicial); // t es un valor entre 0 y 1
B=(((1-t)*(1-t)*(1-t))*p0)+(((3*t)*((1-t)*(1-t)))*p1)+(((3*(t*t))*(1-t))*p2)+((t*t*t)*p3); // se puede optimizar esta formula calculando (1-t) y pasandolo a una variable
return B;
}


Simple y eficiente. En otro post explico la implementación de "claseVector2D".

No hay comentarios: