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

Aktuelle Zeit: Mo Jul 07, 2025 19:48

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Jan 21, 2003 23:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 21, 2003 23:39
Beiträge: 5
Hallo Miteinander,

ich bin Anfänger in der OpenGL Programmierung.
Daher hier meine einfache Frage. Ich positioniere auf
dem Bildschirm ein Objekt welches ein Raumschiff (xwing)
darstellen soll. Die Variable ZPOS wird durch einen Timer
addiert. Das Raumschiff scheint über eine Landschaft zu fliegen.
Allerdings ändern sich die Propationen. Der Xwing wird nach und
nach kleiner. Ist die Positionierung durch "gltranslatef" falsch.
Was kann ich besser machen ?
Danke für eure Hilfe.

Gruß Edgar

procedure TForm1.DrawScene;
begin
ActivateRenderingContext(FDC, FRC);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glClear(GL_DEPTH_BUFFER_BIT);
glTranslatef(xpos,ypos,zpos);
glRotatef(xrot, 1, 0, 0);
glRotatef(yrot, 0, 1, 0);
// Landschaft aufrufen
glCallList(List);
// XWing positionieren und Zeichnen
glPushMatrix;
glLoadIdentity;
glTranslatef(0,0,0);
glscalef(0.001,0.001,0.001);
glRotatef(180, 1, 0, 0);
glRotatef(zdrehung, 0, 0, 1);
glTranslatef(xpos,ypos + 100 ,zpos + 500);
xWing.Draw;
glPopMatrix;
//
SwapBuffers(FDC);
DeActivateRenderingContext;
end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 22, 2003 05:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich bin mir zwar nicht ganz sicher, was du meinst, aber das ein Objekt, wenn es in die Tiefe verschoben wird, "kleiner" wird liegt in der Art der perspektivischen 3D-Darstellung.
Ich hab aber das Gefühl, das du etwas anderes meinst, und deshalb ist mir in deinem Code folgendes aufgefallen :
Code:
  1.  
  2.  
  3. glRotatef(180, 1, 0, 0);
  4.  
  5. glRotatef(zdrehung, 0, 0, 1);
  6.  
  7. glTranslatef(xpos,ypos + 100 ,zpos + 500);
  8.  
  9.  

Da du dein Objekt zuerst rotierst, (einmal um 180° auf der X-Achse, und danach noch auf der Z-Achse) wird auch dein Koordinatensystem mitrotiert, wodurch natürlich auch die Achsen mitrotiert werden, was die Sache mit dem glTranslatef natürlich leicht verändert.

Das was du wohl willst (denke ich zumindest mal), ist wohl folgendes :
Code:
  1.  
  2.  
  3. glTranslatef(xpos,ypos + 100 ,zpos + 500);
  4.  
  5. glRotatef(180, 1, 0, 0);
  6.  
  7. glRotatef(zdrehung, 0, 0, 1);
  8.  
  9.  

Es macht ganz einfach einen Unterschied, ob ein Objekt zuerst verschoben und dann rotiert, oder erst rotiert und dann verschoben wird.
Eine gute Erklärung dazu findet sich übrigens (bebildert und damit gut verständlich) im RedBook.

P.S. : Eine genauere Beschreibung deines "Problems" wäre sehr hilfreich.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 22, 2003 10:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 21, 2003 23:39
Beiträge: 5
OK. Hier also die Langfassung.

Ich möchte gerne eine 3D-Ansicht (Spiel) realisieren,
vergleichbar mit Autorennen, Flugsimulatoren oder auch 3DShooter.
Hierbei ist immer ein Objekt im Vordergrund (z. Bsp. das
Auto welches gesteuert wird) und man bewegt sich durch die
Landschaft.
Um dieses Ziel zu erreichen positioniere ich meine Sicht auf die
Matrix mit den ersten glTranslateF in der Prozedur DrawScene.
Es spielt doch keine Rolle ob der Zug aus dem Bahnhof fährt oder
ob der Bahnhof sich vom Zug enfernt. Um nun das Objekt (Auto)
immer an der gleichen Stelle auf dem Schirm zu positionieren
gebe ich eine zweite glTranslateF Anweisung an. Wenn ich also das
Objekt mit meiner Sicht gleichzeitig verschiebe, müsste die Benutzersicht
so sein, das sich das Objekt immer an der gleichen Stelle auf dem
Schirm befindet. Allerdings sollten dann die anderen Objekte und der
Hintergrund entsprechend verschoben sein. Dieses funktioniert
auch kurz ganz gut, allerdings verändern sich dann auch die Propationen
meines Objektes.
Natürlich ist mir klar, das eine Verschiebung auf der Z-Achse eine Veränderugn der Perspektive mit sich bringt. Allerdings verschiebe ich
doch auch gleichzeitig meine Benutzersicht ( oder ist vielleicht hier
mein Denkfehler ?). :?:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 22, 2003 11:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Aha...die Beschreibung ist doch ein gutes Stück deutlicher.Jetzt weiss ich auch was gemeint ist.
Du willst also eine Third-Person-Ansicht a la Tomb Raider oder Need for Speed, bei der man das zu steuernde Objekt immer vor der Nase hat.

Dazu gibts aber nen weitaus besseren Ansatz als den den du gewählt hast :
- Setzte die Kamera mittels gluLookAt() etwas hinten über den Spieler z.B. gluLookAt(0, 0.5, 3, 0, 0.3, 0, 0, 1, 0)
- Speichere die Modelansichtsmatrix (glPushMatrix)
- Rotiere deine Szene entsprechend der Bewegungsrichtung des Spielers
- Verschiebe die komplette Matrix entgegen der Position des Spielers z.B. glTranslatef(-Spieler.x, -Spieler.y, -Spieler.z)
- Zeichne deine Umgebung und alle anderen Objekte
- Hol die Modelansichtsmatrix wieder zurück (glPopMatrix)
- Zeichne jetzt deine Spielfigur (bzw. dein Raumschiff)

So sollte das dann genauso klappen wie du dirs vorstelltst.

P.S. : In meiner ZornGL-Engine hab ich das genauso wie oben beschrieben gemacht.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 23, 2003 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 21, 2003 23:39
Beiträge: 5
Jau, funktioniert gut.

Danke

Edgar :D


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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 ]