Positionierung von Objekten in OpenGL

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Positionierung von Objekten in OpenGL

Beitrag von Hartkern »

Hallo,

meinen Versuch, eine Tile-Based Map in Canvas zu erstellen hab ich aufgeben und bin dann doch zu OpenGl umgeschwenkt.
Ich hab scheinbar ein Verständnisproblem. Ich versuche Isometrische Tiles in folgender Form anzuordnen

x
x x
x x x
x x
x

also ne riesige Raute...meine erste Linie versuche ich gerade per Hand zu zusammenzuschustern, jedoch müsste eigentlich immer eine Art Versatz dazu kommen, jedoch hab ich entweder nen Knick in der Optik oder die Teile liegen tatsächlich versetzt nebeneinander obwohl ich der Meinung war, sie müssten quasi gestapelt liegen

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);
 
  glMatrixMode(GL_Projection);
  glViewport(0,0,ClientWidth,ClientHeight);
  glLoadIdentity();
  glTranslatef(StartX,Zoom,0.0);
  DrawMap(0.0,0.0,0.0);
  DrawMap(-0.25,-0.25,-0.01);
  DrawMap(-0.30,-0.30,-0.02);   // warum, haben die gleiche Koordinaten, liegen aber versetzt nebeneinander!!!!!
  DrawMap(-0.30,-0.30,-0.03);
  DrawMap(-0.30,-0.30,-0.04);
  OpenGLControl1.SwapBuffers;
end;
 
procedure TForm1.DrawMap(x,y,z : real);
begin
  // --- Textur Aktivieren
  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, textureID0);
  glTranslatef(x,y,z);
  glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0);
  glVertex3f(-0.3, -0.3, 0);
  glTexCoord2f(1.0, 0.0);
  glVertex3f(-0.3, 0.3, 0);
  glTexCoord2f(1.0, 1.0);
  glVertex3f(0.3, 0.3, 0);
  glTexCoord2f(0.0, 1.0);
  glVertex3f(0.3, -0.3, 0);
  glEnd();
end;           

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Positionierung von Objekten in OpenGL

Beitrag von Mathias »

// warum, haben die gleiche Koordinaten, liegen aber versetzt nebeneinander!!!!!

Da addierst die Koordinaten fortlaufend.

Code: Alles auswählen

  DrawMap(0.0,0.0,0.0)//  x=0, y=0, z=0
  DrawMap(-0.25,-0.25,-0.01)// x=-0.25, y-0.25, z-0.01
  DrawMap(-0.30,-0.30,-0.02)// x=-0.55, y-0.55. z-0.03
  DrawMap(-0.30,-0.30,-0.03)// x=-0.85, y-0.85, z-0.06
  DrawMap(-0.30,-0.30,-0.04)// usw.


Hast du dies gemeint, oder verstehe ich dich falsch ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Positionierung von Objekten in OpenGL

Beitrag von wp_xyz »

Du musst in DrawMap anfangs die Modelview-Matrix speichern (glPushMatrix) und am Ende wieder restaurieren (glPopMatrix); zuvor die ModelView-Matrix auswählen (glMatrixMode(GL_MODELVIEW)). Auf diese Weise bleibt das in DrawMap vorgenommene glTranslate ohne Auswirkung auf das Gesamt-Modell.

Code: Alles auswählen

procedure TForm1.DrawMap(x,y,z : real);
begin
  // aktuelle ModelView-Matrix sichern
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix;
  // --- Textur Aktivieren
  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, textureID0);
  glTranslatef(x,y,z);
  glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex3f(-0.3, -0.3, 0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-0.3, 0.3, 0);
    glTexCoord2f(1.0, 1.0); glVertex3f(0.3, 0.3, 0);
    glTexCoord2f(0.0, 1.0); glVertex3f(0.3, -0.3, 0);
  glEnd();
  // Modelview-Matrix wiederherstellen
  glPopMatrix;
end;

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Positionierung von Objekten in OpenGL

Beitrag von Hartkern »

Danke...habs heute Nacht schon hinbekommen :), jedoch läuft es auch ohne das ich in der Procedure Draw glMatrixMode(GL_MODELVIEW); verwende :?: und lediglich nur Push und Pop.

Edit: doch ich brauchte es dann doch :)

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Positionierung von Objekten in OpenGL

Beitrag von Mathias »

jedoch läuft es auch ohne das ich in der Procedure Draw glMatrixMode(GL_MODELVIEW); verwende

Bei diesem einfachen Code fällt dies nicht ins Gewicht, aber wen du mit Perspektiven, Cameras, etc., dann ist es sehr wichtig, welche Matrix aktiv geschalten wird. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten