Jump to content
Sign in to follow this  
Jhonatan00_00

ANSWERED transform.RotateAround pasando por 0º (SOLUCIONADO)

Recommended Posts

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:

Quote

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

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!!.

Circulo.png

Edited by Jhonatan00_00
formatear el texto correctamente facilita su lectura.

Share this post


Link to post
Share on other sites

Es posible que busques Math.LerpAngle: https://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html .

"LERP" es una contracción de "Linear Interpolation", y tenemos varias variantes:

  • normalmente se usa para interpolar o extrapolar entre dos números
  • esta variante "LerpAngle", interpola ángulos (y tiene en cuenta el paso por 0 grados)
  • las variante "Slerp", por "spherical lerp", de los objetos Vector y Quaternion, interpolan vectores y rotaciones sobre la superficie de una esfera
Edited by J Montes
  • Like 1

Share this post


Link to post
Share on other sites

Buenas tardes compañero y gracias por su aportación!!. :1_grinning::91_thumbsup: 

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:

Quote

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

Un saludo y felices fiestas!!.

 

Edited by pioj
Por favor, usa el <> o el "quote" para pegar código.
  • Like 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...