GLUT - Versetzen des Objekts/ der Achsen (Displayliste)

Erks

Erfahrenes Mitglied
Hi,
ich hab ein Bild bei mir im Programm einlesen lassen (Graustufenbild) und dann anhand dieses Bildes mit eine glutDisplay Liste mit ...

Code:
GLuint lid=glGenLists(1);
	glNewList(lid, GL_COMPILE);

Das Objekt wurde dann, als ich das im Fenster ausgegeben habe allerdings nicht in der Position wie auf dem eingelesenen Bild angezeigt, sonder auf dem Kopf und irgendwo weit oben in der Ecke.

  • Sind in einer Display-Liste die Achsen immer im Mittelpunkt (wenn all Koordinaten zusammengefasst sind) oder sind dann immernochh verschiedene Achsen der einzelnen Polygone vorhanden?
  • Gibt es eine Funktion, die, wenn es bei einer Liste nur einmal eine xyz-Achse gibt, das Objekt nicht nur um einen Wert verschiebet, sondern das Objekt direkt auf einen Punkt setzt (z.B. in den Ursprung 0|0|0)?
  • Gibt es auch eine Funktion, die nur die Achsen eines Polygons verändern (Position) und nicht noch das Objekt (im Bezug auf Drehung wäre das interssant)?

Danke für eure Antworten;)
 
  • Sind in einer Display-Liste die Achsen immer im Mittelpunkt (wenn all Koordinaten zusammengefasst sind) oder sind dann immernochh verschiedene Achsen der einzelnen Polygone vorhanden?
  • Gibt es eine Funktion, die, wenn es bei einer Liste nur einmal eine xyz-Achse gibt, das Objekt nicht nur um einen Wert verschiebet, sondern das Objekt direkt auf einen Punkt setzt (z.B. in den Ursprung 0|0|0)?
  • Gibt es auch eine Funktion, die nur die Achsen eines Polygons verändern (Position) und nicht noch das Objekt (im Bezug auf Drehung wäre das interssant)?
Display-Listen sind nur eine Abfolge von OpenGL-Befehlen, die für eine spätere (erneute) Ausführung gespeichert werden. Insofern verstehe ich nicht, welche Achsen du meinst? Welche Befehle hast du denn in der Display-List gespeichert? Was genau versuchst du zu erreichen?

Grüße,
Matthias
 
Hi,
ich meine, wenn mehrer Polygone in eine Gruppe zusammengefasst werden (hab ich schon ein paar Mal in einem 3D Programm gesehen), dann werden die xyz-Achsen in eine zusammengefasst, die dann nicht mehr für die einzelnen Polygone vorhanden ist, sondern für die gesamte Gruppe.

Außerdem konnte man, wenn man möchte, das Objekt so lassen wie es ist und nur die Achsen in der Position verändern (z.B. wenn man das Öffnen einer Tür simuliert).

Gibt es eine Funktion, die, wenn es bei einer Liste nur einmal eine xyz-Achse gibt, das Objekt nicht nur um einen Wert verschiebet, sondern das Objekt direkt auf einen Punkt setzt (z.B. in den Ursprung 0|0|0)?
Es gibt ja diese Translate3f() Funktion und die versetzt das Objekt um einen Wert, den man angibt. Das ist aber hinderlich, wenn man das Objekt irgendwo zeichnen sollte und das dann in den Ursprung setzen will. Hier könnte man zwar mit der aktuellen Position tricksen, aber gibt es dafür nicht eine Funktion? Außerdem hat man ja nicht immer die Position der DisplayListe (zumindest weiß ich noch nicht wie man an die Daten kommt) und wenn dann eine Funktion das direkt herausfiltert, dann wär das ja ein schöner Nebeneffekt.

Gruß
 
Zuletzt bearbeitet:
Hallo Erks,

so kommen wir der Sache schon etwas näher. Bei der 3D-Programmierung muss/kann man zwischen verschiedenen Koordinatensystemen (oder auch Bezugssystemen) unterscheiden:

  1. Ein 3D-Objekt verfügt über ein lokales Objektkoordinatensystem. Das sind die Koordinaten, die man direkt mit bspw. glVertex3f angibt.
  2. Über die sog. Model-Transformation kann man das 3D-Objekt in der Welt platzieren. D.h. man verschiebt, rotiert, skaliert… das Objekt so, dass es an einer bestimmten Stelle in einer bestimmten Größe in einer bestimmten Orientierung… steht bezüglich des Weltkoordinatensystems.
  3. Die so platzierten Objekte will man jetzt von einer bestimmten Betrachterposition aus anzeigen lassen. Dazu wendet man die sog. View-Transformation an, welche die Welt so transformiert, dass der Betrachterpunkt im Ursprung liegt und die Blickrichtung der negativen z-Achse entspricht. Man befindet sich dann im Kamerakoordinatensystem.
  4. Bei der Projektion der Objekte auf den Bildschirm durchwandert man noch ein paar Koordinatensysteme, die aber zunächst weniger interessant sind.

Das heißt in deiner Display-Liste spezifizierst du die Objektkoordinaten. Wenn du dann dein Objekt platzieren willst, setzt du die GL_MODELVIEW-Matrix entsprechend. In dieser sind die beiden Transformationen aus 2. und 3. zusammengefasst. Danach rufst du einfach die Display-Liste auf und die Vertices werden an die richtige Stelle transformiert. Beispiel für Drehung um 90° und anschließende Verschiebung an die Position (1, 2, 3):
Code:
glMatrixMode(GL_MODELVIEW);
glTranslate3f(1.f, 2.f, 3.f);
glRotatef(90.f, 0.f, 1.f, 0.f);
glCallList(lid);
Dabei bin ich jetzt davon ausgegangen, dass in der Modelview-Matrix vorher schon die View-Transformation eingetragen war. Das kann man z.B. mit gluLookAt erreichen:
Code:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(4., 6., 7., 1., 2., 3., 0., 1., 0.);
Damit würde man erreichen, dass die Kamera im Punkt (4, 6, 7) sitzt, auf den Punkt (1, 2, 3) schaut und (0, 1, 0) für die Kamera „oben“ ist.

Grüße,
Matthias
 
Zurück