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
Home