ich möchte mich völlig frei im Raum bewegen. Dazu habe ich einen Punkt und drei normalisierte Vektoren (Position der Kamera, "X,Y,Z-Achsen-Vektoren" = also die Ausrichtung der Kamera).
Nun möchte ich mich drehen und habe dazu einen Matrix zur freien Rotation um eine beliebige Achse im freien Raum erstellt.
Dann habe ich Matrix für Vektorkomponenten gelöst:
Die Sinus- und Cosinus-Winkel sind vorberrechnt. Result ist der neue Vektor; Xa, Ya und Za ist der alte Vektor.
X, Y, Z ist Achse um die gedreht werden soll.
Diese Funktion funktioniert auch, aber die Drehgeschwindigkeit schwankt sehr stark und kommt teilweise zum Stillstand.
Warum haut das nicht hin, die Matrix ist richtig und ich habe sie auch richtig aufgelöst. Was ist falsch oder hat jemand eine bessere Möglichkeit sich frei im Raum zu bewegen?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich wühl mich nur sehr ungern durch solche unübersichtlichen Konstrukte, deshalb poste ich mal wie ich den Freelook/Move-Modus in meinen Demos realisiert habe :
Funzt einwandfrei und auch die Drehgeschwindigkeit macht hier keine Probleme. Bei deiner Sache tippe (definitiv kann ichs nicht sagen) mal auf den Gimbal-Lock, zu dessen Vermeidung man AFAIK Quaternionen zur Repräsentation von Rotationen verwenden muss. Da ich aber auf dem Gebiet kein Experte bin ist das nur ne Vermutung.
Ich habe mir auch gedacht das es irgendwelche Ungenauigkeiten oder Rundungsfehler sein müßten. Die Formel ist schon ganz schon wirr, aber was soll man machen wenn man nicht weiß wie es sonst gehen könnte.
Ich habe gerade mal dein Quelltext ausprobieren wollen, aber ihn nicht ganz verstanden. Was sind welche Variablen?
Es ist zwar nicht die beste Lösung, aber um zu prüfen ob die Matrix richtig ist, kann man auch mit glRotate die Einheitsmatrix um eine Achse rotieren lassen und danach mit glGetDoublev auslesen.
Bei der völlig freien Drehung dreht man sich nicht um die Achsen der Welt sondern um seine eigenen Achsen, falls du das meinst. Man multipliziert dann die Achsenvektoren der Kamera mit der Rotationsmatrix. Die Rotationsmatrix um eine beliebige Achse kann man so berechnen:
Den Vektor multipliziert man dann so mit der Matrix:
Code:
v_.x:=Matrix[0]*v.x+Matrix[4]*v.y+Matrix[8]*v.z;
v_.y:=Matrix[1]*v.x+Matrix[5]*v.y+Matrix[9]*v.z;
v_.z:=Matrix[2]*v.x+Matrix[6]*v.y+Matrix[10]*v.z;
Falls man wie in den meisten 3D Shooter läuft und nicht z.B. fliegt, reicht die ganz normale Drehung die SoS gezeigt hat aus. Dann braucht man auch keine 3 Achsen sondern nur 2 oder 3 Winkel für die Kamera.
[/url]
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.