![]() |
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 ![]() 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 ![]() 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; |
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 |
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 |
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 12:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz