Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda! necesito crear una rotacion de 90° smooth

Iniciado por GuauGames, Febrero 06, 2016, 03:15:04 AM

Tema anterior - Siguiente tema
Febrero 06, 2016, 03:15:04 AM Ultima modificación: Junio 10, 2016, 02:52:13 AM por pioj
Hola que tal gente, primero les explico un poco mi problema; estoy desarrollando un juego para moviles con una jugabilidad algo parecida a TempleRun, el problema que tengo es que cuando llego a una esquina y girar este de un brinco ya esta viendo hacia donde gire, lo que yo quisiera hacer es que cuando gire se vea mas smooth, o sea que no gire de golpe y se vea al personaje girando un poco. El personaje usa un Character controller, seria que deba cambiar a rigidbody? Aqui esta mi script en la parte del giro: 
  
 



   
       if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true))
              {
                  transform.Rotate (Vector3.up * Time.deltaTime * giroizquierda);
                  direccionAux = false;
              }
   

[/quote]



   
       
   
   
      // en el inspector giroizquierda y giroderecha tiene un valor muy elevado (para que gire 90° de un solo golpe) aprox. 4500.
   
   
              if ((Input.GetKey (KeyCode.D)) && (direccion == true)&& (direccionAux == true))
              {
                  transform.Rotate (Vector3.up * Time.deltaTime * giroderecha);
                  direccionAux = false;
              }
   
   
       
   

[/quote]
 
Estuve investigando y hay unas cosas que se llaman quaternion segun con esto puedo resolver el problema, pero yo no se nada de quaternion, Si alguien me explicara la sintaxis de como usar los quaterniones, o igualmente si alguien tiene una manera diferente de hacer el script estaria muy agradecido que me lo hagan saber. Un saludo a todos!

Prueba a cambiar la rotación con Slerp:
transform.rotation = http://docs.unity3d.com/ScriptReference/Quaternion.Slerp.html" rel="external nofollow">Quaternion.Slerp(from.rotation, to.rotation, http://docs.unity3d.com/ScriptReference/Time-time.html" rel="external nofollow">Time.time * speed);

Febrero 06, 2016, 10:32:18 AM #2 Ultima modificación: Junio 10, 2016, 02:52:27 AM por pioj
Cita de: gomeslaw date=1454727672Prueba a cambiar la rotación con Slerp:
      
      

transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);

   

Lo intente pero me sigue dando el mismo resultado, un brinco. Asi es como me quedo tal vez puedas ayudarme:
 
  
 



   
       if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true))
              {
                  
                  transform.rotation = Quaternion.Lerp(transform.rotation, (transform.rotation = Quaternion.Euler(0,CambioA,0)), Time.time * 0.5f);
                  direccionAux = false;
                  CambioA = CambioA - 90;
                  CambioD = CambioD -90;
              }
   

[/quote]
 
 

Febrero 06, 2016, 12:45:12 PM #3 Ultima modificación: Junio 10, 2016, 02:52:59 AM por pioj
Buenas!! A ver , no estas entendiendo el Lerp,Slerp,  jejejeje a todos nos paso dont worry 
 



   
      lerp("inicio","final","TANTO PORCIENTO");
   

[/quote]
 
Quiero decir.... 
 



   
       
   
   
      lerp(0,2,0f); nos dara 0
   
   
      lerp(0,2,0.5f); nos dara 1
   
   
      lerp(0,2,1f); nos dara 2  
   
   
      lerp(0,2,0.25f); nos dara 0.5
   
   
       
   

[/quote]
 
Imagina una linea entre el valor a y el b ,el ultimo parametro nos indica en que posicion  por tanto porciento %%%%%% de 0 a 1 siendo 1 = 100%.
 
algo asi seria
 

 void Update(){
     
    if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true) && !rotating){
        StartCoroutine(Rotar(Time.time,transform.rotation, 90f));
    }
    if ((Input.GetKey (KeyCode.D))&& (direccion == true) && (direccionAux == true) && !rotating){
        StartCoroutine(Rotar(Time.time,transform.rotation, -90f));
    }
}
IEnumerator Rotar(float startTime, Vector3 startRotation, float angleDir){
    rotating = true;
    float percentage = 0f;
    Quaternion targetRotation = Quaternion.Euler(transform.eulerAngles.x,transform.eulerAngles.y + angleDir,transform.eulerAngles.z);
    while(percentage < 1f){
         percentage = (Time.time - startTime) / rotTime;
        transform.rotation = Quaternion.Lerp(startRotation,targetRotation,percentage);
    yield return null:
  }
rotating = false;
}

 
Cheers!!
 
 

Febrero 07, 2016, 12:26:17 AM #4 Ultima modificación: Junio 10, 2016, 02:53:29 AM por pioj
Cita de: hammer date=1454759112Buenas!! A ver , no estas entendiendo el Lerp,Slerp,  jejejeje a todos nos paso dont worry 
      
      
         lerp("inicio","final","TANTO PORCIENTO");
      
      
         Qui decir.... 
      
      
         lerp(0,2,0f); nos dara 0
      
      
         lerp(0,2,0.5f); nos dara 1
      
      
         lerp(0,2,1f); nos dara 2  
      
      
         lerp(0,2,0.25f); nos dara 0.5
      
      
         Imagina una linea entre el valor a y el b ,el ultimo parametro nos indica en que posicion  por tanto porciento %%%%%% de 0 a 1 siendo 1 = 100%.
      
      
         algo asi seria
      
      
          
      
      

void Update(){
     
    if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true) && !rotating){
        StartCoroutine(Rotar(Time.time,transform.rotation, 90f));
    }
    if ((Input.GetKey (KeyCode.D))&& (direccion == true) && (direccionAux == true) && !rotating){
        StartCoroutine(Rotar(Time.time,transform.rotation, -90f));
    }
}
IEnumerator Rotar(float startTime, Vector3 startRotation, float angleDir){
    rotating = true;
    float percentage = 0f;
    Quaternion targetRotation = Quaternion.Euler(transform.eulerAngles.x,transform.eulerAngles.y + angleDir,transform.eulerAngles.z);
    while(percentage < 1f){
         percentage = (Time.time - startTime) / rotTime;
        transform.rotation = Quaternion.Lerp(startRotation,targetRotation,percentage);
    yield return null:
  }
rotating = false;
}

      
         Cheers!!
      
      
          
      
   

Ok hice todo lo que me dijiste excepto 2 cosas, la primera es que me marca error cuando trato de que transform.rotation sea vector3 startrotation, lo que hice fue cambiar vector 3 startrotation a quaternion startrotation. Lo segundo es que no se exactamente que es lo que tratas de hacer con la linea que dice:
 



   
      percentage = (time.time - startTime) / rotTime; 
   

[/quote]
 

 
 
Se supone que time.time - startTime da igual a 0 no? y el rotTime no se que sea, yo estableci rottime = 1 y se me congelo unity.
 
aqui esta la parte del script para que veas como me quedo.
 



   
              if ((Input.GetKey (KeyCode.D)) && (direccion == true)&& (direccionAux == true) && !rotando)
              {
                  StartCoroutine (Rotar (Time.time, transform.rotation, 90f));
              }
                  
           }
   

[/quote]

    IEnumerator Rotar(float TiempoInicio, Quaternion RotacionInicio, float AnguloDir ){
        rotando = true;
        float porcentaje = 0f;
        Quaternion ObjetivoRotacion = Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y + AnguloDir, transform.eulerAngles.z);
        while (porcentaje < 1f) {
        
            porcentaje = (Time.time - TiempoInicio) / rotTime;
            Debug.Log ("%" + porcentaje);
            transform.rotation = Quaternion.Lerp (RotacionInicio, ObjetivoRotacion, porcentaje);
        }
        yield return null;
    }

 
Hammer ya lo solucione, el problema era que habia puesto mal el yield return y por eso se congelaba xD . Ya hice un debug.log para saber lo del porcentaje, la diferencia es que tiempoinicio no se mueve y Time.time va aumentando. 
 
Como sea muchas gracias por todo.  Te pondre en los creditos de mi juego, tienes alguna pagina web o algun nickname en especial que quieras que ponga?
Saludos!

Si me equivoque con el Vector3 era quaternion, sorry  no lo probe xD  .Me alegro , no hace falta que me nombres  hahahaha, its okbien hecho con el debug.log, no lo dejes nunca xD. Basicamente rotTime es el tiempo que quieres tarde el lerp de ir del punta A al B, dependiendo del tiempo que haya pasado ya sabes en que tanto porciento se encuentra, esto va bien hacerlo asi para no tener problemas con diferentes frameRates.

Etiquetas: