Einzelnen Beitrag anzeigen

Flippo

Registriert seit: 26. Sep 2004
111 Beiträge
 
Delphi 2005 Personal
 
#1

Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen

  Alt 24. Jul 2007, 21:10
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

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;
Miniaturansicht angehängter Grafiken
glfehler_111.jpg  
  Mit Zitat antworten Zitat