Ich drehe meinen Spielcharakter, um das Ziel mit dem folgenden Code zu beobachten:
transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)
startQuaternion ist die aktuelle Rotation des Charakters, wenn ein neues Ziel angegeben wird.
lookQuaternion ist die Richtung, in die der Charakter schauen soll, und sie ist wie folgt eingestellt:
destinationVector = currentWaypoint.transform.position - transform.position;
lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);
turnNormalizer wird nur Time.deltaTime
inkrementiert und turningSpeed
ist ein statischer Wert, der im Editor angegeben wird.
Das Problem ist, dass sich der Charakter zwar die meiste Zeit so dreht, wie er sollte, aber Probleme hat, wenn er sich in der Nähe von 180 Grad bewegen muss. Dann zittert und spiegelt es manchmal die Rotation:
In diesem schlecht gezeichneten Bild beginnt sich das Zeichen (rechts) in Richtung des Kreises links zu drehen. Anstatt sich nur nach links oder rechts zu drehen, beginnt dieser "Spiegeltanz":
- Es beginnt sich in Richtung der neuen Verkleidung zu drehen
- Dann schnappt es plötzlich in den gleichen Winkel, aber auf der anderen Seite, und dreht sich weiter
Diese "Spiegelung" wird so lange durchgeführt, bis das Ziel angezeigt wird. Ist das eine Sache mit Quaternionen, Slerping / Lerping oder etwas anderem?
EDIT1: Anscheinend entsteht das Problem nicht durch das Drehen selbst. Das wahrscheinlichere Problem ist, dass sich der Charakter während der Drehung in Richtung der Vorderseite bewegt. Durch die Begrenzung des Winkels zwischen Ausrichtung und Ziel wird die Jitter- / Spiegelrotation verringert und zeitweise beseitigt, wenn sich der Charakter bewegen darf.
Dies wirft natürlich weitere Fragen auf: Warum kann sich der Charakter nicht ohne Probleme gleichzeitig bewegen und drehen? Für die Bewegung verwendeter Code:
transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);