Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen (https://www.delphipraxis.net/96446-ziel-eine-landschaft-mit-opengl-ich-erzeuge-streifen.html)

Flippo 24. Jul 2007 21:10


Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich hoffe der Titel war einigermaßen Aussagekräftig.
Also, ich probiere gerade OpenGl anhand der Tutorials von DGL-Wiki bedienen zu lernen.

Jezt versuche ich gerade eine Landschaft zu erzeugen, indem ich mehrere schräge Quads aneinander setze. Ich mache das so:
1. Ich generiere 11*11 zufällige Y-Werte/Höhenwerte und speichere diese in einem Memo
2. Jeder dieser Punkte ist ein Eckpunkt eines Quads, die aneinander liegenden Quads haben natürlich gemeinsame Eckpunkte
Die Theorie habe ich aus dem Tutorial, die sollte also stimmen :-D

Mein Code erzeugt aber nur Streifen(Siehe Bild im Anhang),die Quads in X-Richtung liegen aneinander, wie es sein soll, aber die Quads in Z-Richtung nicht. Sie haben komischerweise andere Höhenwerte.(Ich habe mir die Y-Werte beim Erstellen der Quads auch schon(mit Showmessage) anzeigen lassen und das "aufgemalt", da waren die Werte eigentlich alle Richtig)
Daher vermute ich, dass mein Quelltext einen Fehler hat auf den ich auch nach mehreren Stunden Suche nicht gekommen bin oder das ich einen Denkfehler drin habe.
Ich hoffe ihr könnt mir helfen:

Delphi-Quellcode:
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DC:=GetDC(panel1.Handle);
if not InitOpenGL then showmessage('Init OpenGL fehlgeschlagen!');
RC:=CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
ActivateRenderingContext(DC, RC);
glClearColor(0, 0, 0, 0);
glEnable(GL_DEPTH_TEST);
fTexture := TglBitmap2D.Create('myTex\floor.JPG'); // Instanz erstellen und Datei laden
fTexture.GenTexture; // geladene Textur an OpenGL übergeben
end;

procedure TForm1.Render; //Hier wird wohl der Fehler liegen....
var x,z:integer;
    u,v:real;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight,NEAR_CLIPPING,FAR_CLIPPING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-COUNT_X/2, -3, -14);
glRotatef(45,1,0,0);
fTexture.Bind;
U:=1/COUNT_X; V:=1/COUNT_Z;
{Hier werden Reihe für Reihe die Quads erstellt.
 Bei den nebeneinander liegenden Quads klappt es mit gemeinsamen Eckpunkten,
 bei den "hintereinander" liegenden (Z-Richtung) klappt es nicht.
}
for z:=0 to COUNT_Z-1 do
begin
   glPushMatrix;
   for x:=0 to COUNT_X-1 do
   begin
      glBegin(GL_QUADS);
         glTexCoord2f(U*x,V*(z+1));
         glVertex3f(0, GetTheFuckingY(x,z) ,0);   //1 "vorne Links"
         glTexCoord2f(U*x,V*z);
         glVertex3f(0, GetTheFuckingY(x,z+1) ,1); //2 "hinten Links"
         glTexCoord2f(U*(x+1),V*z);
         glVertex3f(1, GetTheFuckingY(x+1,z+1) ,1);//3 "hinten Rechts"
         glTexCoord2f(U*(x+1),V*(z+1));
         glVertex3f(1, GetTheFuckingY(x+1,z) ,0); //4 "vorne Rechts"
      glEnd;
      glTranslatef(1,0,0);
      {SwapBuffers(DC);Ich kann leider nicht sehen wie der Fehler entsteht :-D
      sleep(1000); }
   end;
   glPopMatrix;
   glTranslatef(0,0,-1);
end;
SwapBuffers(DC);
end;

function TForm1.GetTheFuckingY(x,z:integer):real;
//Gibt aus dem Memo namens L aus der Zeile z den x'ten Wert zurück
// (gibt die richtigen Werte zurück)
var s:string;
    i,j:integer;
begin
s:=L.Lines[z];
i:=pos('!'+inttostr(x),s); while (s[i]<>'-') do i:=i+1; i:=i+1;
j:=i; while s[j]<>';' do j:=j+1; j:=j-i;
result:=strtofloat(copy(s,i,j))/1000; //(durch 1000 damit die Größe passt)
end;

procedure TForm1.Button3Click(Sender: TObject);
//11*11 Punkte erzeugen
var x,z:integer;
begin
L.Clear;
Randomize;
for z:=0 to COUNT_Z do
begin
   L.lines.add('');
   for x:=0 to COUNT_X do L.Lines[z]:=L.Lines[z]+'!'+inttostr(x)+'-'+inttostr(Random(LIM))+';';
end;
end;

FAlter 24. Jul 2007 22:02

Re: Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen
 
Hi,

ich würde dir empfehlen, statt dessen Dreiecke zu nehmen, dann kriegst du es noch schöner hin, zumal die Grafikkarten in der Regel intern eh nur mit Dreiecken rechnen.

Ansonsten vermute ich mal, dass die Höhen nicht übereinstimmen. Eventuell liegt auch das schon an den Vierecken. Habe deinen langen Code nicht komplett durchgesehen. Nimm der Einfachheit halber ein zweidimensionales Array, dann kannst du immer bequem auf die zwei Kanten zugreifen und es einfacher machen.

Mfg
FAlter

Flippo 25. Jul 2007 11:49

Re: Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen
 
Danke schonmal,
ja an den unterschiedlichen Höhen wird es liegen, mein Problem ist nur, dass die Höhen unterschiedlich sind obwohl sie gleich seien sollten.

Wenn es mir um das Ergebnis geht würde ich mit Dreiecken arbeiten, aber wie gesagt will ich das nur lernen und da ist es irgendwie einfacher sich das mit Vierecken vorzustellen :wink:

MfG

flippo

Flippo 25. Jul 2007 12:19

Re: Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen
 
So,
habe das Ganze jezt nochmal neu mit einem 2D-Array probiert und es funktioniert.
Habe meinen Fehler vom ersten Versuch zwar immernoch nicht gefunden, aber ich habe ein buntes Bild und bin zufrieden.
Danke nochmal :thumb:

MfG

flippo

(Falls es jemanden interessiert)
Delphi-Quellcode:
procedure TForm1.Render;
var x,z:integer;
    u,v:real;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight,NEAR_CLIPPING,FAR_CLIPPING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-COUNT_X/2, -3, -14);
glRotatef(45,1,0,0);
fTexture.Bind;
u:=1 / COUNT_X; v:=1 / COUNT_Z;
for z:=0 to COUNT_Z-1 do
begin
  glPushMatrix;
  for x:=0 to COUNT_X-1 do
  begin
     glBegin(GL_QUADS);
        glTexCoord2f(u*x,V*(z+1));
        glVertex3f(0,map[x,z+1],0);
        glTexCoord2f(u*x,v*z);
        glVertex3f(0,map[x,z],1);
        glTexCoord2f(u*(x+1),v*z);
        glVertex3f(1,map[x+1,z],1);
        glTexCoord2f(u*(x+1),v*(z+1));
        glVertex3f(1,map[x+1,z+1],0);
     glEnd;
     glTranslatef(1,0,0);
  end;
  glPopMatrix;
  glTranslatef(0,0,-1);
end;
SwapBuffers(DC);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz