Ruoto il mio personaggio di gioco per guardare il bersaglio usando il seguente codice:
transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)
startQuaternion è la rotazione corrente del personaggio quando viene dato un nuovo bersaglio.
lookQuaternion è la direzione in cui il personaggio dovrebbe guardare ed è impostato in questo modo:
destinationVector = currentWaypoint.transform.position - transform.position;
lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);
turningNormalizer è appena Time.deltaTime
incrementato ed turningSpeed
è un valore statico indicato nell'editor.
Il problema è che mentre il personaggio gira come dovrebbe per la maggior parte del tempo, ha problemi quando deve fare quasi 180 gradi. Quindi a volte si agita e rispecchia la rotazione:
In questa immagine mal disegnata il personaggio (a destra) inizia a girare verso il cerchio a sinistra. Invece di girare semplicemente a sinistra oa destra, inizia questa "danza dello specchio":
- Inizia a ruotare verso il nuovo fronte
- Quindi improvvisamente scatta con la stessa angolazione ma dall'altro lato e continua a ruotare
Fa questo "mirroring" così a lungo fino a quando non guarda il bersaglio. È una cosa con quaternioni, slerping / lerping o qualcos'altro?
EDIT1: Apparentemente il problema non deriva dalla rotazione stessa. Il problema più probabile è che il personaggio si sposta verso il fronte mentre ruota. Come limitare l'angolo, tra il fronte e il bersaglio, quando il personaggio è autorizzato a muoversi riduce ed a volte elimina la rotazione del jitter / mirroring.
Questo ovviamente solleva più domande, perché il personaggio non può muoversi e ruotare contemporaneamente senza problemi? Codice utilizzato per il movimento:
transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);