OpenGL v Delphi4



Načítání 3D objektů ze souboru (*.dxf) (Autocad, 3D MAX...).


Příklad a zdroják ke stažení (403k)



Příklad, jak načíst 3D objekt ze souboru (*.dxf). DXF je textový formát (Autocad, 3D MAX...), který je rozdělen na různé sekce a skupiny. Tento prográmek umí číst pouze sekci (ENTITIES) a skupinu (3DFACE). Soubory uložené v tomto formátu najdete na http://www.3dcafe.com/asp/meshes.asp



Pro načtení souboru (*.dxf) jsem napsal tuto proceduru.

procedure LoadDXF(filename:String);
var sou:textfile;
    L1:longint;
    S1:String;

function LoadString:String;
var St:String;
    L1:longint;
begin
     readln(sou,St);
     for L1:=1 to length(St) do if St[L1]='.' then St[L1]:=',';
     LoadString:=St;
end;

function LoadLong:longint;
var S1:String;
    L1:longint;
begin
    readln(sou,S1);L1:=Strtoint(S1);LoadLong:=L1;
end;


begin
   AssignFile(sou,filename);reset(sou);
   L1:=LoadLong;S1:=LoadString;
   TriangleMax := 0;
   if (L1<>0) or (S1<>'SECTION') then begin close(sou);exit;end;
   repeat
   L1:=LoadLong;S1:=LoadString;
   if L1=10 then begin  TriangleMax := TriangleMax + 1;
                        Point1[TriangleMax].x := StrToFloat(S1);end;
   if L1=20 then begin  Point1[TriangleMax].z := StrToFloat(S1) end;
   if L1=30 then begin  Point1[TriangleMax].y := StrToFloat(S1) end;
   if L1=11 then begin  Point2[TriangleMax].x := StrToFloat(S1) end;
   if L1=21 then begin  Point2[TriangleMax].z := StrToFloat(S1) end;
   if L1=31 then begin  Point2[TriangleMax].y := StrToFloat(S1) end;
   if L1=12 then begin  Point3[TriangleMax].x := StrToFloat(S1) end;
   if L1=22 then begin  Point3[TriangleMax].z := StrToFloat(S1) end;
   if L1=32 then begin  Point3[TriangleMax].y := StrToFloat(S1) end;
   until (S1='EOF');
   close(sou);
end;



Funkce

function LoadString:String;
var St:String;
    L1:longint;
begin
     readln(sou,St);
     for L1:=1 to length(St) do if St[L1]='.' then St[L1]:=',';
     LoadString:=St;
end;

Načítá první řádek souboru a převádí na 'string'.

Funkce
 
function LoadLong:longint;
var S1:String;
    L1:longint;
begin
    readln(sou,S1);L1:=Strtoint(S1);LoadLong:=L1;
end;

Načítá druhou řádku souboru a převádí na 'integer'.

Pokud soubor nezačíná

0
SECTION

tak se soubor nebude dále načítat.
Příkaz vypadá takto:

if (L1<>0) or (S1<>'SECTION') then begin close(sou);exit;end;



Funkce 'LoadString' a 'LoadLong' se pak volají ve smyčce, dokud se nenačte celý soubor.

repeat
  L1:=LoadLong;S1:=LoadString;
  if L1=10 then begin  TriangleMax := TriangleMax + 1;
                       Point1[TriangleMax].x := StrToFloat(S1);end;
  if L1=20 then begin  Point1[TriangleMax].z := StrToFloat(S1) end;
  if L1=30 then begin  Point1[TriangleMax].y := StrToFloat(S1) end;
  if L1=11 then begin  Point2[TriangleMax].x := StrToFloat(S1) end;
  if L1=21 then begin  Point2[TriangleMax].z := StrToFloat(S1) end;
  if L1=31 then begin  Point2[TriangleMax].y := StrToFloat(S1) end;
  if L1=12 then begin  Point3[TriangleMax].x := StrToFloat(S1) end;
  if L1=22 then begin  Point3[TriangleMax].z := StrToFloat(S1) end;
  if L1=32 then begin  Point3[TriangleMax].y := StrToFloat(S1) end;
until (S1='EOF'); 



Výsledné hodnoty se převádějí na souřadnice bodů (Point1, Point2, Point3), ze kterých pak procedura

procedure DrawTriangles;
var
  i,j: integer;
begin
      glPushMatrix;
        glBindTexture(GL_TEXTURE_2D, TextureBin[1]);
        glEnable(GL_TEXTURE_2D);

        for i := 1 to TriangleMax do begin
        Coord1[i].x := 0;
        Coord1[i].y := 0;
        Coord2[i].x := 1;
        Coord2[i].y := 0;
        Coord3[i].x := 0;
        Coord3[i].y := 1;

        glBegin(GL_TRIANGLES);
          glTexCoord2f(Coord1[i].x,Coord1[i].y);
          glVertex3f(Point1[i].x,Point1[i].y,Point1[i].z);

          glTexCoord2f(Coord2[i].x,Coord2[i].y);
          glVertex3f(Point2[i].x,Point2[i].y,Point2[i].z);

          glTexCoord2f(Coord3[i].x,Coord3[i].y);
          glVertex3f(Point3[i].x,Point3[i].y,Point3[i].z);
        glEnd;
        end;
      glPopMatrix;
end;

renderuje trojůhelníky.

Celý zdroják si můžete prohlídnout
DXF_f



Výpočet koule, normálových vektorů, texturové koordinace Lesklé předměty
Home