Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:10

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Achsen ausrichten
BeitragVerfasst: Mi Apr 28, 2010 17:21 
Offline
DGL Member
Benutzeravatar

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;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Achsen ausrichten
BeitragVerfasst: Mi Apr 28, 2010 18:08 
Offline
DGL Member
Benutzeravatar

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

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Achsen ausrichten
BeitragVerfasst: Do Apr 29, 2010 08:10 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Achsen ausrichten
BeitragVerfasst: Do Apr 29, 2010 08:25 
Offline
DGL Member
Benutzeravatar

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.

Danke,

Andree


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 17 Queries | GZIP : On ]