Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Hallo,
folgendes Problem beschäftigt mich zur zeit:
Ich möchte eine beliebig im Raum stehende Szene ausrichten. Das könnte ich ja einfach machen, indem ich die Identitätsmatrix als aktuelle Projektionsmatrix nehme. Es soll aber nicht sprungartig gehen sondern die Szene soll sich über die Achsen in die richtige Position drehen.
Gedacht habe ich mir das folgendermaßen:
Ich nehme den jeweiligen Achsenvektor aus der aktuellen Matrix und den dazu passenden aus der Identitätsmatrix und errechne daraus den Winkel der Vektoren zueinander sowie die auf diesen Vektoren stehende Senkrechte. Dann kann ich mit glRotate vom Ausgangspunkt in beliebig vielen Schritten zum Endpunkt drehen. Wenn ich diesen Vorgang nacheinander für jede Achse durchführe, müsste ich eigentlich vertikal und horizontal ausgerichtet sein.
Aber Pustekuchen.
Meine Szene dreht sich zwar über alle drei Achsen ungefähr in die richtige Position, aber nicht genau. Und auch dann, wenn die Szene genau ausgerichtet ist, dreht ie sich noch.
Hat jemand eine bessere Idee?
Danke,
Andree
Code:
. . . // über alle achsen ausrichten (drehen) GetRotation (GetMatrixX (Netz.PCamera^.CameraMatrix.Matrix), glVector (1, 0, 0), Rotation); for i := 1 to 33 do begin Netz.PCamera.RotateCamera(Rotation.Vector, Rotation.angle/33); WinObj.PaintNew; end; . . . procedure GetRotation (V1, V2: TGLVector; var Rotation: TRotation); // ermittelt den winkel zur rotation eines körpers // und die zur Drehung benötigte Achse. begin Rotation.Vector := Normalize (CrossProduct (V1, V2)); Rotation.angle := DotProduct (V1, V2); end;
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
berechne dir erst die Winkel (so wie du es schon gemacht hast), dann änderst du den Winkel un berechnest dir mit dem neuen Winkel wieder die Vektoren. Die kannst du dann mit gluLookAt deine Kamera neu positionieren...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das sie sich weiter dreht klingt nach rundungsfehlern.
Kannst du das nicht einfach per einem Flag lösen, welches gesetzt ist, wenn du dich neu ausrichtest, und sobald "CurrentAxis.isNerly(targetAxis)" gilt, schießt du das Flag auf False und bleibst stehen.
Falls du ein Objekt verfolgen willst, dann ist gluLookAt besser geeignet.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Hallo,
vielen Dank für Euere Antworten. Ich bin davon ausgegangen, das nach der Berechnung des zu drehenden Winkels und der Drehachse ein einmaliges Drehen die berechnete Achse gleich dem Wert der Identitätsmatrix für diese Achse setzen müsste. Deswegen wollte ich mit einer Division dieses Winkels durch z.B. 10 in 10 Schritten zu meinem Ziel kommen. Dem ist aber nicht so. Mit der von Euch angemerkten Näherung klappt es jetzt.
guckst Du:
Code:
function AdjustZ: boolean; // oder AdjustY, AdjustX var Rotation: TRotation; begin GetRotation (GetMatrixZ (CameraMatrix.Matrix), glVector (0, 0, 1), Rotation); if Rotation.angle <> 0 then begin repeat Netz1.PCamera.RotateCamera(Rotation.Vector, Rotation.angle/33); PaintNew; // hier wird der winkel immer kleiner, da sich die ausgangssituation geändert hat GetRotation (GetMatrixZ (Netz1.PCamera^.CameraMatrix.Matrix), glVector (0, 0, 1), Rotation); until abs (Rotation.angle) < ADJUST_TOLERANCE; // kann beliebig gesetzt werden end; result := true; end;
Nach der Lösung dieses Problems ist mir aber leider aufgefallen, dass das gelöste Problem gar nicht das war, welches zu der von mir gewünschten Lösung führt. Drehe ich nämlich so wie ich es jetzt realisiert habe, nähere ich mich immer der Identitätsmatrix an, lande also immer in der gleichen Lage, egal von wo aus ich die Drehung beginne.
Mein Anliegen ist es aber nur eine von mir beliebig zu bestimmende Achse auszurichten. Ich fahre mit meiner Kamera so über einen bestimmten Punkt, dass ich senkrecht von oben darauf schaue. Jetzt möchte ich die X-Achse der Szene so ausrichten, dass sich die Szene nur um die Y-Achse dreht, bis die X-Achse waagerecht liegt. Wenn ich den vorigen Ansatz nehme schaue ich nach der Drehung nicht mehr von oben, sondern von vorne auf die Szene.
Mitglieder in diesem Forum: Bing [Bot], Majestic-12 [Bot] und 3 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.