MaZy Geschrieben 29. April 2019 Melden Share Geschrieben 29. April 2019 Hallo ich hab ein Problem mit der 180 Grad Rotation, wenn ich etwas mit Quaternion berechnen lasse. Und zwar hab ich ein Script wo man sein Charakter relativ zur Kamera in 8 Richtungen bewegen kann und sich dahin auch dreht. Wenn man W drückt dreht man sich in die Richtung wo Kamera guckt. Drückt man D dann dreht man sich nach rechts. Wenn man nun die Kamera bewegt.. dreht sich logischerweise der Charakter mit (solange man die Bewegungstasten drückt). Wie die typischen Third Person Spiele mit Orbit Kamera (meist mmorpgs). Dabei passiert folgendes. Drücke ich W und Kamera ist 100 Grad bei Y dann dreht sich der Charakter auch auch in die Richtung 100 Grad. Ich hab nun gemerkt, wenn bei der Kamera Y-Axe 180,-180 oder auch bei 0, 360 steht, dann wird aber beim Charakter (wenn ich W drücke oder S) nicht Y 180 vergeben, sondern xyz ist dann (0, 180, 180) und ich weiß nicht wieso. Also Rotatation Y Axe 180 bedeutet, dass man beider Z Axe in die Gegenrichtung guckt (also quasi forward = 0,0,-1) und bei 0 oder 360 wäre es Richtung Z (also forward = 0,0,1). Nun wenn ich W und A drücke, dann ist man bei (0,135,0) und bei W UND D (0, 225, 0). Die Werte sind korrekt. Verstehe nicht warum bei 180 sowas passiert. Wie kann man das denn lösen. var camForward = Camera.main.transform.forward; camForward.y = 0; var lookRot = Quaternion.FromToRotation(new Vector3(-h, 0, v), camForward); // h = horizontal, v = vertical inputs lookRot.eulerAngles.DebugValue("lookRot Euler", false); character.movement.SetRotation( Quaternion.RotateTowards(character.movement.transform.rotation, lookRot, smoothSensivityCharacterTurn * Time.deltaTime) ); EDIT: Sehe auch bei 0 Grad hat es bei auch bei Rotation (-180,0,0) angezeigt. Voll komisch EDIT2: Hab fürs erste mal einfach den eulerAngles.y von lookRot genommen und somit funktioniert mein Script zwar, aber mich wundert es trotzdem warum es so berechnet wird. character.movement.SetRotation( Quaternion.RotateTowards(character.movement.transform.rotation, Quaternion.Euler(new Vector3(0, lookRot.eulerAngles.y,0)), smoothSensivityCharacterTurn * Time.deltaTime) ); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 29. April 2019 Melden Share Geschrieben 29. April 2019 Ich denke dein Problem kommt vom Gimbal Lock. Also jetzt nicht direkt, aber hat mit dem Phaenomen zu tun. Kannst ja mal das Netz dazu durchsuchen, denn ich kann das schlecht erklären. Tritt immer dann auf wenn 90° Winkel anstehen. So auch bei dir mit 180, -180, 0 oder 360. Quaternion umgeht dass Problem mit dem 4ten Vectorteil und dann gibt es keinen Gimbal Lock. Problem dabei ist aber die Wandlung in Eulerangles. Denn dann kann es zu diesen Verdrehungen um 180° kommen weil jetzt ja der 4 Vectorteil nicht mehr genutzt wird und somit 2 Ergebnisse möglich sind. Wie ich schon gesagt habe, ich kann es schlecht erklären. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.