Jump to content
Unity Insider Forum
Sign in to follow this  
MaZy

Angle Y 180 ergibt Y=180 Z=180

Recommended Posts

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)
            );

 

Share this post


Link to post
Share on other sites

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. ;)
 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...