AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen
Thema durchsuchen
Ansicht
Themen-Optionen

Ziel:eine Landschaft mit OpenGL, Ich erzeuge: Streifen

Ein Thema von Flippo · begonnen am 24. Jul 2007 · letzter Beitrag vom 25. Jul 2007
Antwort Antwort
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, 22: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
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 24. Jul 2007, 23:02
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
Felix Alter
  Mit Zitat antworten Zitat
Flippo

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

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

  Alt 25. Jul 2007, 12:49
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

MfG

flippo
  Mit Zitat antworten Zitat
Flippo

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

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

  Alt 25. Jul 2007, 13:19
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

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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 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