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

Aktuelle Zeit: Fr Jul 18, 2025 14:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: gluLookAt
BeitragVerfasst: Fr Nov 11, 2005 10:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

um ein Objekt so im Raum zu positionieren, dass es auch in eine bestimmte Richtung schaut, ist gluLookAt sehr hilfreich. Laut Beschreibung positioniert es den Benutzer so, dass er vom durch die ersten drei Parameter bestimmten Punkt auf den durch Parameter 4 bis 6 bestimmten Punkt schaut und das so ausgerichtet, wie es die letzten 3 Parameter vorgeben. Gleichzeitig soll der durch Parameter 4 bis 6 vorgegebene Punkt den Mittelpunkt der neuen Szene beschreiben.

Übergebe ich z.B. glulookat die Parameter

0,-10,0
0,10,0
0,1,0

nachdem ich glLoadIdentity aufgerufen habe so erwarte ich, dass später die Modelviewmatrix folgendermaßen aussieht:

1,0,0,0
0,1,0,0
0,0,10,0
0,-10,0,1

Leider ist dem nicht so. Ich finde die Werte

1,0,0,0
0,1,0,0
0,0,-1,0
0,-10,0,1

Das macht ja in diesem Fall nicht viel, weil die Ausrichtung und Positionierung dem gleich kommt was ich erwarte. Schlimmer wird es wenn ich beliebige Werte angebe. Dann verändert gluLookAt sowohl die Position wie auch den ViewPoint. Das bedeutet, dass ich von einem nicht vorherbestimmbaren Punkt auf einen beliebigen anderen Punkt schaue.

Kennt jemand eine Möglichkeit das selber zu machen, damit es auch stimmt?

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 11, 2005 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Würdest du die von dir angegebene Modelviewmatrix setzen hättest du ein völlig verzerrtes Bild. Ich kann mir nicht vorstellen, dass du genau das erreichen willst.

Die letzten 3 Parameter von gluLookAt beschreiben einen Vektor der nach „oben“ zeigt. „Oben“ ist hierbei aus Sicht der Kamera. Der UpVektor darf auf keinen Fall in Blickrichtung bzw. in die inverse Blickrichtung zeigen sonst kann das Ganze nicht funktionieren.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Danke!!!!!!!!!!!!!!
BeitragVerfasst: Sa Nov 12, 2005 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Manchmal komme ich mir so vor, als wenn die Leser sich keine Mühe mit dem Verständnis der Beiträge geben würden. Die Werte die ich hier angegeben habe, habe ich aus dem Debugger entnommen. Die Werte die ich erwartet habe, habe ich auch ausprobiert und es gibt da keine Verzerrungen oder sonstige seltsamen Effekte.

Was die Parameter bei gluLookAt bedeuten weiß ich auch, da ich mich bereits seit einigen Monaten mit dieser und anderen Transformationsfunktionen beschäftige. Leider scheint mein Wissen noch nicht auszureichen um mein derzeitiges Problem zu lösen:

Ich würde nur gerne wissen wie ich es mit glTranslate und glRotate hinbekomme einen ViewPoint zu setzen um dann auf einen bestimmten Punkt in meiner Szene zu schauen, wenn diese angezeigt wird. Ich habe bisher gluLookAt eiungesetzt, aber das arbeitet nicht so wie ich es erwarte wenn ich aus dem Nullpunkt herausgehe.

Sagen wir mal ich zeichne einen Zylinder von 20/20/-100 bis -30/-30/20. Dann möchte ich eine glTranslate-, glRotate-Abfolge haben mit der ich am Punkt 20/20/-100 stehe und auf -30/-30/20 schaue um in den Zylinder hineinzuschauen. Ich probiere es schon ein paar Tage und habe auch Teilerfolge zu verzeichnen aber so richtig bekomme ich es halt nicht hin...

Derzeit sieht meine Lösung so aus:

Code:
  1.  
  2.   // winkel für die rotation ausrechnen
  3.   GetRotation (ViewVec, PositionVec, Rotation, Normale);
  4.  
  5.   // hier soll der Drehpunkt sein (siehe Apply...)
  6.   FPointOfRotation := PositionVec;
  7.  
  8.   glMatrixMode (GL_MODELVIEW);
  9.   glLoadIdentity;
  10.  
  11.   glTranslatef (-PositionVec.X,
  12.                 -Positionvec.Y,
  13.                 -Positionvec.Z);
  14.   glRotatef (-Rotation.angle, Rotation.x, Rotation.y, Rotation.z);
  15.  


Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 12, 2005 11:21 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
http://pyopengl.sourceforge.net/documentation/manual/gluLookAt.3G.htmlIn 0 komma nix gefunden. Und bitte greif nicht gleich an, der obige Poster hatte besten Absichten.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 12, 2005 11:51 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
AndyH, zieh' die Leute bitte nicht runter, wenn sie dir helfen möchten.
Zu deinen Matrizen-Werten aus dem Debugger... Evtl. schauen die nur deshalb so merkwürdig aus, weil OpenGL eine Matrix ja spaltenweise ablegt und nicht zeilenweise, wie sie im Debugger evtl. angezeigt wird.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 12, 2005 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Wenn du gluLookAt mit folgenden Parametern aufrufst
glLookAt(0,-10,0, 0,10,0, 0,1,0) dann befindet sich deine Kamera an der Position (0, -10, 0) und dein Ziel an der Position (0, 10, 0). Dein UpVektor zeigt nach (0, 1, 0) und somit genau in Blickrichtung, was aber nicht sein darf, wie ich bereits zuvor geschrieben habe.

Wenn deine Modelviewmatrix so aussieht:
(1,0,0,0
0,1,0,0
0,0,10,0
0,-10,0,1)

dann hat das denselben Effekt wie ein Aufruf von glScalef(1, 1, 10) und bewirkt damit eine Verzerrung. Ob die Matrix nun zeilenweise oder spaltenweise angegeben wurde ist hierbei egal, denn es handelt sich ja um ein Feld in der Diagonale der Matrix.

Dein Ziel mit glTranslate und glRotate zu erreichen wird schwer, wenn deine Kamera absolut frei beweglich sein soll.
Da ist es einfacher die Matrix selbst zu berechnen oder gluLookAt zu nutzen.

Zu deinem Beispiel:
gluLookAt(20, 20, -100, -30, -30, 20, UpX, UpY, UpZ);

Hier musst du nur noch den UpVektor angeben. Idealerweise berechnet man ihn einmal zu Beginn, wenn in der Regel auch völlig klar ist, wo denn nun oben und unten ist und passt ihn anschließend immer an.
Ein möglicher UpVektor wäre z.B. (0, ~0.923, ~0.384)

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: ´tschuldigung...
BeitragVerfasst: So Nov 13, 2005 07:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
tut mir leid.

Sollte sich jemand angegriffen gefühlt haben, so möchte ich mich bei Ihm entschuldigen.

Ich bin seit Tagen in ein Problem vertieft, habe viel gelesen und probiert und denke mir dann, dass es wohl keine schlechte Idee wäre mal jemanden zu fragen, der eine freiere (nicht so speziell problemorientiert) Sicht auf die Dinge hat. Ich war wirklich ein bisschen genervt. Diese ganze Positions-, View- und UpVector Problematik kam mir schon zu den Ohren raus. Da war ich halt ein bisschen genervt als mir jemand erklären wollte, was ich schon verinnerlicht zu haben dachte.

Aber die ganze Sache war kein Vektor oder glulookat Problem sondern eine falsche Sichtweise meinerseits.

Das Problem:

Ich habe eine Szene. Diese Szene ist imnmer statisch, z.B. eine Häuserlandschaft. Jetzt möchte ich in ein Fenster eines bestimmten Hauses gucken um auf den Tisch zu sehen. Das Fenster hat z.B. die Koordinaten 100/20/-30. Der Tisch hat die Koordinaten 102/19/24,5. Zusätzlich habe ich eine Kamera eingesetzt. Diese Kamera erlaubt es mir die Szene von jedem beliebigen Punkt aus anzusehen und durch sie hindurchzulaufen. Ist die Kamera bei 0/0/0 aufgesetzt, kann ich ohne Probleme in ein Fenster sehen, was bei 0/0/20 liegt. Will ich in ein Fenster sehen wie oben beschrieben und positioniere Die Kamera auf die beschriebenen Werte, klappt es nicht mehr. Das Objekt entfernt sich von mir.

Das liegt daran, dass man mit einer Kamera ja nie den Betrachterpunkt verändert, sondern die aktuelle Matrix. Ich habe also den virtuellen Kamerapunkt auf die Fensterkoordinaten verschoben. Wenn ich jetzt von diesem verschobenen Punkt aus das Fenster konstruiere, ist es ja nicht im Mittelpunkt sondern (vom Betrachter aus gesehen) immer noch an den ihm eigenen Koordinaten.

Ich musste also beim positionieren der Kamera die Positionen negieren, um im Nullpunkt herauszukommen, der ja der Betrachterstandpunkt ist. Jetzt klappt alles. Ich werde mein Kameramodul im WiKi aktualisieren sobald ich wieder Zugriff habe.

Danke.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]