Noticias

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

Quaternion.Slerp y sentido de la rotacion

Iniciado por ftejada, Mayo 29, 2017, 02:23:17 PM

Tema anterior - Siguiente tema
Hola a todos!! existe alguna manera para que en Quaternion.Slerp o funciones similares de rotacion, la rotacion vaya en el sentido en el que sería mas largo en vez del camino más corto????
 
No se si me explico. Cuando haces el Quaternion.Slerp siempre rota en el sentido más corto para llegar al objetivo, pero yo tengo un personaje el cual quiero que gire el cuello por ejemplo 135 ~ -135 grados respecto al forward del personaje.
 
Es decir si pulso la palanca del mando hacia la Izq pues el personaje rota el cuello hacia la izquierda max -135grados respecto al forward del personaje. Y si pulso hacia la dch pues gira el cuello hacia la dch. Hasta ahí todo bien.
 
El problema viene cuando, estando el cuello rotado hacia la izquierda 135grados, pulso para que el cuello se gire a la dch los 135grados respecto al forward del personaje. Ahí el Quaternion.Slerp escoje el camino más corto de rotacion y hace que el cuello rote en un sentido que no me conviene, ya que lo hace por la espalda del personaje y parece la niña del exorcista con el cuello para atras, hasta que llega a los 135grados pero por el lado dch respecto al forward del personaje.
 
Espero que se entienda a lo que me refiero ya que puede ser algo confuso de entender...
 
Saludos y gracias.

Supongo que has visto la API, no parece haber forma de escoger, tendrías que indicarle que rotara primero hacia 0, no sé como lo tienes pero igual así;
 

Quaternion rot;
Update ()
{
rot = Quaternion.Euler (0,130*Input.GetAxis("Horizontal"),0);
transform.localRotation = Quaternion.Slerp(transform.localRotation,rot,1);
}

 
No sé si funcione, pero la idea es rotar hacia el valor que indique el axis, si es que usas el axis horizontal, si el axis está en -1 girará hasta menos 130 en Z, si cambias a +1 primero pasará por varios valores intermedios.
 
Un saludo!!

has probado simplemente con 
 

transform.Rotate(Vector3.up , rootSpeed * Time.deltaTime);

 
tendrias que verificar manualmente con que la rotacion este entre los limites deseados pero dberia funcionar

Esa es la idea de los Lerp, obtienen la diferencia toman la distancia (angular en este caso) y toman un factor de esa distancia, y haces lo mismo para el efecto suavizado, jamas se daria el caso de hacerlo de la forma mas larga porque no es lo que hace slerp, con el Rotate y el signo del valor podes manejar para que lado rota (hacia los -135 o hacia los 135) dependiendo de la entrada que usas izq o der.
 
Otra cosa, si queres medir el angulo, si es positivo o neg respecto del centro lo podes sacar asi, midiendo el angulo entre player-target y el right del cuerpo (entre otras posibles relaciones):
 

 
Ahora, si queres que solo lo limite en partes iguales los medis del forward al player-target, no importa si es pos o neg en este caso.

Gracias a los tres por contestar!
 
Bueno ayer generé un codigo que soluciona el problema. Pero en mi opinión (lo mismo estoy equivocao), utilizo demasiadas lineas de codigo para poder solucionarlo. Quizás se pueda simplificar más y que sea más eficiente.
 
Así que voy a probar lo que habeis comentado para ver si así lo puedo simplificar más de lo que tengo actualmente y comento.
 
 
 
Saludos y gracias por la ayuda.

Etiquetas: