Einzelnen Beitrag anzeigen

Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#7

Re: [GLScene] Ein Dorf erstellen...

  Alt 17. Dez 2006, 13:24
Hi.

Also, zu dem Terrain.
Hier der Code für ne Wiese mit vordefinierten Wegen.


Zuerst legst du ein Bitmap-File mit der Größe deines Terrains an. Also wenn das Terrain 64*64 groß sein soll, dann wird das Bitmap 64*64 Pixel groß.
Nehmen wir an du willst also ein Terrain machen, welches einfach eine Wiese mit einem kleinen Platz und nem Teich darin darstellen soll. Bei mir würde das dann so aussehen (64*64)
http://flips5.fl.funpic.de/map.png

Zur Farberklärung:
  • Grün->Wiese
  • Dunkles Grau->Kiesel
  • Helles Grau->Übergang Wiese-Kiesel oder Kiesel-Wasser (mit Blending beispielsweise)
  • Blau->Wasser

So, jetzt brauchst du noch ne Routine zum auslesen (Optimierungswürdig ):
Delphi-Quellcode:

const SECTORS_COUNT = 4; //Wasser, Wiese, Kiesel, Grenzfäche
      SIZE = 4096; //64*64
      LENGTH = 64;
type Pixel = record
  koordinate : TPoint;
  farbe : TColor;
end;

type Sector = record
  farbe : TColor;
  filename : string;
end;

//Global
var Pixels : array [0..SIZE] of Pixel;
    Sectors : array [0..SECTORS_COUNT-1] of Sector;
    bit : TBitmap;


[...]

//=======ONCREATE========//

Sectors[0].farbe = clGreen;
Sectors[0].filename = 'texturen/wiese.tga';
[...]


bit := TBitmap.Create;
try
  bit.LoadFromFile(ExtractFilePath(ParamStr(0))+'level1.bmp');
  i:=0;
  for x := 0 to bit.Width-1 do
    for y := 0 to bit.Height-1 do
      begin
        Pixels[i].color := bit.Canvas.Pixels[x,y];
        Pixels[i].koordinate.X := x;
        Pixels[i].koordinate.Y := y;
        inc(i);
      end;
  finally
    bit.Free;
  end;
[...]
Wie gesagt, der Code is optimierungswürdig


So, als nächstes brauchst du einen Code der das ganze in OpenGL darstellt.
Delphi-Quellcode:

procedure RenderPixel(pPixel:TPixel;Nummer:integer);
begin
case pPixel.Color of
  clGreen : WiesenTextur.Bind; //Entsprechende Texturen Binden
  clGray : Kiesel.Bind; //Entsprechende Texturen Binden
  clMedGray : //Hier musste dir halt überlegen wie du das mit dem Blending machst :-)
  clBlue : Wasser.Bind; //Entsprechende Texturen Binden
end;
with pPixel.koordinate do
begin
  glBegin(GL_QUADS);
    glTexCoord2f(0,0);
      glVertex3f(x,1,y -LENGTH);
    glTexCoord2f(0,1);
      glVertex3f(x,1,(y-LENGTH)+1);
    glTexCoord2f(1,1);
      glVertex3f(x+1,1,(y-LENGTH)+1);
    glTexCoord2f(1,0);
      glVertex3f(x+1,1,y-LENGTH);
  glEnd();
end;
end;

//Aufruf

procedure Render;
var i:integer;
begin
//Der sonstige OGL Kram
//...


for i := 0 to SIZE-1 do
  RenderPixel(Pixels[i],i);


//Der sonstige OGLKram
//...
end;
So ich nehme an die Hälfte is falsch un die andere Hälfte hab ich vergessen^^
Philipp F.
  Mit Zitat antworten Zitat