Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Funcion para control de angulo - fiero

Iniciado por ethernet, 24 de Marzo de 2003, 12:02:53 AM

« anterior - próximo »

ethernet



    Este es un código en apariencia sencillo, pero muy util. Es una función
    que sirve para realizar incrementos a una variable que almacena un
    ángulo. Se establecen dos topes para los valores válidos de ese ángulo,
    de tal manera que nunca podrá ser menor que un mínimo ni mayor que un
    máximo establecido.

    El código es muy versatil, ya que no funciona restringiendo los valores
    de ángulos no válidos, sino comprobando el valor original y el valor
    después del incremento.

    Por ejemplo, poniendo un valor mínimo de -1 y un valor máximo de 1, el
    ángulo solo tendrá un arco de giro de 2 grados; pero poniendo los
    límites a la inversa, mínimo 1 y máximo -1, el arco de giro será de 358

    grados.

    Un ejemplo típico de su uso es el de la cámara de un FPS, donde el giro
    en el eje X está limitado a -90º (mirar hacia abajo) y 90º (mirar hacia
    arriba).

    Parece una tonteria de función, pero tiene su cosa para que funcione con
    CUALQUIER límite de ángulos. Por lo menos yo me estuve machacando la
    cabeza muchas horas hasta que conseguí esta solución tan sencilla. Si a
    alguien le parece que sobra algo o que falta algo que lo diga en voz alta....

    un saludo
    fiero





//Devuelve un valor entre -180.0 y 180.0

float negAng(float angulo)

{

angulo=fmod(angulo,360);

if(angulo>180) angulo-=360;

if(angulo<-180) angulo+=360;

return(angulo);

}



//Devuelve un valor entre 0.0 y 360.0

float posAng(float angulo)

{

angulo=fmod(angulo,360);

if(angulo<0) angulo+=360;

return(angulo);

}



//Suma un incremento a un angulo y devuelve un valor entre 0.0 y 360.0

//dentro de los límites

bool sumarAngulo(float *angulo,float incremento,float topemin,float topemax)

{

bool encontradoTope=0

float ang,topeMAX,topeMIN;



topeMAX=negAng(topemax);

topeMIN=negAng(topemin);

ang=negAng(*angulo);

if(incremento>0)

{

 if(ang>topeMAX) ang-=360;

 ang+=incremento;

 if(ang>topeMAX)

 {

  ang=topemax;

  encontradoTope=1;

 }

 *angulo=posAng(ang);

}

else if(incremento<0)

{

 if(ang<topeMIN) ang+=360;

 ang+=incremento;

 if(ang<topeMIN)

 {

  ang=topemin;

  encontradoTope=1;

 }

 *angulo=posAng(ang);

}

return encontradoTope;

}





//Ejemplo de uso



float rotacionCamaraX=0;

float limiteAbajo=-50;

float limiteArriba=60;



sumarAngulo(&rotacionCamaraX,-10,limiteAbajo,limiteArriba);








    Éste código fue enviado por  fiero
    Si quieres enviar tu propio código hazlo a  
eth_cotd@lycos.es

    ethernet







    Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
    Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
    Muchísimas gracias.