Unity Spain

Mesa de ayuda => Unity3D => Scripting => Mensaje iniciado por: Jhonatan00_00 en Diciembre 24, 2019, 02:26:48 PM

Título: transform.RotateAround pasando por 0º (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Diciembre 24, 2019, 02:26:48 PM
Buenas tardes caballeros, paso a detallar mi segunda duda sobre programación y a ver si podemos encontrar una solución, porque le va a servir a mucha mas gente si no para esto para hacer otra cosa parecida.
 
Estoy usando transform.RotateAround para que cuando mi personaje se pare, si por ejemplo se ha quedado mirando a la derecha y no tocamos nada durante unos segundos, la cámara se reposicione detrás y para ello lo he hecho de la siguiente manera:
 



   
      Rotación = transform.rotation.y  - Personaje.rotation.y;

      transform.RotateAround (Personaje.transform.position, Vector3.up, Rotación *Time.deltaTime); 
   

[/quote]
 
Funciona, pero solo cuando los dos objetos quedan rotados a menos o a mas de 180º, porque cuando no se dan estas circunstancias, la cámara en lugar de rotar por el camino mas corto en ángulos, lo que hace es rotar por el camino mas largo al no poder pasar por el angulo 0º, ya que no entran en la resta de ángulos "Cámara - Personaje" mas de 360º. Lo explico con una imagen para que se entienda mejor y mis dudas son:
 
- ¿Como puedo hallar el camino mas corto si necesito que la cámara pase por los 0º?.
 
- ¿Existe alguna función como Quaternion.Slerp que lo haga automáticamente (¿o incluso la propia función lo hace?)?.
 
Un saludo y felices fiestas!!.
 
Título: transform.RotateAround pasando por 0º (SOLUCIONADO)
Publicado por: nomoregames en Diciembre 24, 2019, 02:37:52 PM
A mi me ocurrió lo mismo (aquí te dejo el post donde lo pregunto)

 
Espero que alguien pueda resolver la duda.
Título: transform.RotateAround pasando por 0º (SOLUCIONADO)
Publicado por: J Montes en Diciembre 25, 2019, 05:21:49 PM
Es posible que busques Math.LerpAngle: https://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html (https://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html) .
 
"LERP" es una contracción de "Linear Interpolation", y tenemos varias variantes:
 
Título: transform.RotateAround pasando por 0º (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Diciembre 25, 2019, 06:23:58 PM
Buenas tardes compañero y gracias por su aportación!!.  
 
La función Math.LerpAngle de Unity no sirve exactamente para lo que estábamos intentando solucionar, porque lo que hace es interpolar linealmente entre un angulo mínimo y un ángulo máximo, pero gracias a su comentario me he puesto a investigar un poco mas y existe la función llamada Mathf.DeltaAngle que si está pensada exactamente para solucionar el problema. La forma de usar esta función es la siguiente:
 



   
      Rotación = Mathf.DeltaAngle (transform.eulerAngles.y, Personaje.transform.eulerAngles.y);
      transform.RotateAround (Personaje.transform.position, Vector3.up, Rotación *Time.deltaTime);
   

[/quote]
 
Un saludo y felices fiestas!!.