Ich hab mich mal durch das Kamera1-Tutorial gewurschtelt und bin da auf die TObjekt-Konstruktion gestoßen mit der THomogeonousMatrix als Rotationsangabe. Ich habe bisher dafür immer einen Vektor benutzt, woltle ich mich aber mal auf das neue einstellen . Was mache ich denn jetzt, wenn ich ein Objekt anhand meiner Rotation bewegen will? Dann brauche ich schließlich Cosinus und Sinus meiner Y-Rotationswinkels. Nur wie komme ich an jene aus meiner Rotationsmatrix? Ich hab leider bisher nur Vektoren und noch keine matrizen in Mathe gemacht, deswegen ist das ganze etwas schwer für mich
Ich danke für Hilfe!
P.S.: Das Einbauen und Rendern und Rotieren mit der Matrix klappt wohl
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ichhab mir grad ma meinen alten Algebra-hefter angesehen. ich glaub ich könnte da was basteln, aber dazu muss ich erstma wissen wie die THomogeonousMatrix aussieht, hab dazu nix gefunden.
Und wieso nimmst du nich enfach n Vector für die Rotationen? is meiner meinung nach einfacher...
eigentlich ganz einfach: Ein Array[0..3] of Array[0..3] of TGLFloat bzw. Single.
Zitat:
Und wieso nimmst du nich enfach n Vector für die Rotationen? is meiner meinung nach einfacher...
Meiner Meinung auch nur das schöne an der Matrixrotation ist, dass man da direkt die OpenGL-Matrix mit der eigenen Multipliziert und man sich immer das Umrechnen von Winkel in Bogenmaß sparen kann. Und ich dachte, es wäre vlt einfacher, wie es mit der Matrix geht, wenn man weiß, wie es geht
Dann brauche ich schließlich Cosinus und Sinus meiner Y-Rotationswinkels.
Bist du sicher, dass du den Winkel aus der Matrix heraus rechnen musst? So etwas ist mit großen Ungenauigkeiten verbunden. Du solltest ebenfalls nicht versuchen eine bestehende Matrix mit einer sehr kleinen Rotationsmatrix zu rotieren. Also eine Matrix z.B. um einen Winkel von 0.01° dreht, was schnell passiert wenn du mit Winkel * timeElapsed arbeitest. Das führt schnell zu Ungenauigkeiten und deine Matrix degeneriert. Es ist gesünder den Rotationswinkel zusätzlich zu speichern und die Matrix neu zu berechnen.
Ideal ist natürlich die Verwendung von Einheits-Quaternionen. Diese haben kein Problemen mit sehr kleinen Rotationen. Hier ist das Verständnis kompliziert, es handelt sich um vierdimensionale komplexe Zahlen. Aber die Anwendung nicht komplizierter als Matrizen. Allerdings sind wir im Einsteiger-Forum, daher gehe ich da nur auf Nachfrage genauer drauf ein.
Zitat:
das Umrechnen von Winkel in Bogenmaß sparen kann.
Das aufwendige, wenn man mit Winkeln rechnet ist nicht das umrechnen in Bogenmaß, sondern eher Sinus und Cosinus, sowie vor allem deren Umkehrfunktionen.
Hmm, ok. Also "Einheits-Quaternionen" sagen mir leider gar nichts, aber es hört sich interessant an
Ich habe eben mal meine Berechnungsweise in einer Grafik erleutert. Gibt es denn sonst eine andere Methode, die sich bei Matrizen anwenden lässt?
Ich hätte sonst nur als zweite Idee, noch einen Look-Vektor wie im Tutorial "Objekt gedreht und trotzdem nach vorne bewegt" zu verwenden... Also einen, der das Objekt dreht, und einer, mit dessen Hilfe die neuen Positionen berechnet werden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gibt es denn sonst eine andere Methode, die sich bei Matrizen anwenden lässt?
Eine Rotationsmatrix (3x3-Matrix) ist nichts weitere als eine Basistransformation. Du gibst mit drei Vektoren an auf welche Vektoren die Koordinatenachsen abgebildet werden sollen.
Mit zwei Vektoren und einer Position kannst du so eine Matrix bauen:
1. ein Vektor der dahin zeigt wo bei deinem Objekt vorne sein soll. In deinem Bild der rote Vektor.
2. ein Vektor der dahin zeigt wo oben sein soll. Sofern dein Objekt nicht irgendwie einen Looping (etc.) fliegen kann, reicht hier ein (0,1,0).
3. eine Position an der sich der Mittelpunkt des Objektes befinden soll
Mit diesen Daten rufst du dann nur noch die folgende Funktion auf:
Hmm, also mit dem C++-Quelltext komm ich schon klar Mein Problem ist ja eigentlioch gar nicht die Matrix ans ich, wie man sie eibaut, berechnet, etc. Ich frage mich nur, wie ich aus ihr wieder die Winkel bekomme, um meine Rechnung von der Grafik oben durchzuführen. Wie komme ich an den Winkel Alpha um von ihm Sinus und Cosinus zu berechnen, damit ich mit denen den neuen Positonsvektor berechnen kann?
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Das blaue Rechteck ist also Deine Kamera, schon klar. Wenn sie sich immer nur nach links und rechts dreht, hast Du auch in 3D keine Schwierigkeiten, denn bei OpenGL ist Y die "Aufwärts"-Achse und die läßt Du immer Null, dann gibt es keine Probleme. Die Frage ist natürlich, was tust Du, wenn Du nach oben schauen willst?
Ich meine, welchen Winkel möchtest Du dann messen?
Äh, nein. Das ist nicht die Kamera, sondern ein Objekt (ein Würfel). Die Kamera spielt keine Rolle, die hab ich ja mit der Rotationsmatrix gelöst, so wie im Kamera1-Tutorial. Und die Y-Achse ist doch die, die nach oben zeigt, folglich verändern sich nur X-Z-Koordinaten und damit dreht sich das Objekt nach links oder rechts, und mehr muss es ja auch nicht können.
Nicht so wirklich, das ist ja mein Problem. Meine Rechnung aus der Grafik oben ist mir eben als einzige variante vertraut, nur sie benötigt eben eine konkrete Winkelangabe. Die habe ich ja eben bei einer Matrix nicht! Deswegen frage ich mich ja, ob es eine möglichkeit gibt, die neue Position mit Hilfe der - übrigens - 4x4-matrix zu berechnen.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Du möchtest immer die Objektposition kennen und die Blickrichtung, nicht wahr? Und Du bewegst Dich auf der X/Z-Ebene.
Eine Möglichkeit ist, sich einen Vorwärts-Vektor zu merken. Der erste Vorwärts-Vektor eines Objekts ist der Z-Plus-Vektor: (0/0/+1). Sobald Du Dein Objekt bewegst, kannst du diesen Vorwärtsvektor mit der gleichen Matrix multiplizieren, mit der das Objekt bewegt wird. Um den Winkel zu kriegen, müsste man nur mehr messen, wie weit der transformierte Vorwärts-Vektor vom Z-Plus-Vektor abweicht. Das ist keine besonders komplizierte Rechnung: das Skalarprodukt der beiden (Einheits)-Vektoren ergeben den Cosinus des Winkels.
Aha! Also ich führe in meine Klasse "TObjekt" einen Vorwärtsvektor ein, der in die Richtung zeigt, in die ich mich bewegen will und ändere ihn dann, wenn sich das Objekt dreht, wenn ich dich richtig verstanden habe? also sagen wir, er ist anfangs auf ( 0, 0, 1 ), zeigt in positiver x richtung, ich drehe um 0,5° und dann ändere ich den Vektor in ( sin( 0,5 ), 0, cos( 0,5 ) )? Und ändere anhand ihm dann meinen Positionsvektor, also posv_neu = posv_alt + faktor * vorwärtsv?
Oder hab ich dich falsch verstanden?
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
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.