Quaternions - Rotation zurück setzen
Verfasst: 19.02.2013, 21:14
Hallo Community,
ich habe ein Problem mit den Quaternions. Ich versuche gerade eine Steuerung für mein Flug-Spiel zu programmieren, dabei möchte ich im Prinzip eine Steuerung wie bei dem Spiel Star Wars Rogue Squadron (http://www.youtube.com/watch?v=_cbR_ZTCzFY) implementieren.
Wenn man zum Beispiel nach links fliegt, soll sich der Flieger um die Y-Achse drehen und zugleich auch etwas um die z-Achse drehen. Also sich in die Kurve rollen.
Lässt man die Taste wieder aus, soll sich der Flieger wieder gerade drehen (Z-Achse = 0).
Das Fliegen in alle Richtungen funktioniert schon mal ganz gut! Ich zeige euch hier mal den Code dazu:
Damit kann ich breites Loopings machen, links/rechts fliegen und er dreht sich auch in der Kurve! Jedoch fehlt mir jetzt noch das zurück drehen in die z-Achse. Ich habe bereits eine Lösung, leider funktioniert sie jedoch nicht so wie sie sollte:
Das zurück drehen der Z-Achse(roll=0) damit der Flieger wieder gerade ist funktioniert damit gut. Jedoch funktioniert damit der Looping nicht mehr... Wenn man jetzt nach oben fliegt und bei ca. der Wende ankommt, dreht sich der Flieger plötzlich nur mehr um die y-Achse. Irgendwie scheint es, als hätte ich einen Freiheitsgrad oder so durch die Euler-Winkel verloren.
Habt ihr eine Ahnung was ich falsch mache? Ich kenne mich leider mit Quaternions noch nicht so gut aus... Gibt es eine einfache Möglichkeit wie ich den z-Wert eines Quaternions auf der z-Achse nach 0 drehen kann? Mit der Methode Quaternion.AngleAxis(..) kann man leider immer nur einen Winkel angeben um den man sich weiter drehen möchte.
Würde mich freuen wenn ihr mir helfen könnt! :) Danke schon mal.
Liebe Grüße,
Northwind877
ich habe ein Problem mit den Quaternions. Ich versuche gerade eine Steuerung für mein Flug-Spiel zu programmieren, dabei möchte ich im Prinzip eine Steuerung wie bei dem Spiel Star Wars Rogue Squadron (http://www.youtube.com/watch?v=_cbR_ZTCzFY) implementieren.
Wenn man zum Beispiel nach links fliegt, soll sich der Flieger um die Y-Achse drehen und zugleich auch etwas um die z-Achse drehen. Also sich in die Kurve rollen.
Lässt man die Taste wieder aus, soll sich der Flieger wieder gerade drehen (Z-Achse = 0).
Das Fliegen in alle Richtungen funktioniert schon mal ganz gut! Ich zeige euch hier mal den Code dazu:
Code: Alles auswählen
float r = Input.GetAxis("Horizontal")*rollSpeed*Time.deltaTime;
float p = Input.GetAxis("Vertical")*pitchSpeed*Time.deltaTime;
Quaternion rotZ = Quaternion.AngleAxis(r,new Vector3(0,0,1));
Quaternion rotY = Quaternion.AngleAxis(r,new Vector3(0,1,0));
Quaternion rotX = Quaternion.AngleAxis(p,new Vector3(1,0,0));
transform.rotation *= rotZ;
transform.rotation = rotY * transform.rotation; // um world achsen drehen
transform.rotation *= rotX; //lokal drehen
Code: Alles auswählen
//hier ist das problem, soll den flieger in z-Achse wieder zurück drehen
Quaternion rotBack = transform.rotation;
Vector3 tempRotBack = rotBack.eulerAngles;
rotBack = Quaternion.Euler(tempRotBack.x,tempRotBack.y,0); //funktioniert auch
transform.rotation = Quaternion.Lerp(transform.rotation, rotBack, 0.03f);
Habt ihr eine Ahnung was ich falsch mache? Ich kenne mich leider mit Quaternions noch nicht so gut aus... Gibt es eine einfache Möglichkeit wie ich den z-Wert eines Quaternions auf der z-Achse nach 0 drehen kann? Mit der Methode Quaternion.AngleAxis(..) kann man leider immer nur einen Winkel angeben um den man sich weiter drehen möchte.
Würde mich freuen wenn ihr mir helfen könnt! :) Danke schon mal.
Liebe Grüße,
Northwind877