Noticias

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

Temas recientes

transform.RotateAround pasando por 0º (SOLUCIONADO)

Iniciado por Jhonatan00_00, Diciembre 24, 2019, 02:26:48 PM

Tema anterior - Siguiente tema
Diciembre 24, 2019, 02:26:48 PM Ultima modificación: Diciembre 25, 2019, 06:25:28 PM por Jhonatan00_00
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!!.
 

A mi me ocurrió lo mismo (aquí te dejo el post donde lo pregunto)

 
Espero que alguien pueda resolver la duda.

Diciembre 25, 2019, 05:21:49 PM #2 Ultima modificación: Diciembre 25, 2019, 05:22:29 PM por J Montes
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


Diciembre 25, 2019, 06:23:58 PM #3 Ultima modificación: Diciembre 26, 2019, 09:56:30 AM por pioj
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!!.
 
 

Etiquetas: