Форум: "Игры";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизGMS файлы Найти похожие ветки
← →
Dimanizm (2003-10-21 23:50) [0]Привет всем!!!В интернете очень много
говорится о GMS файлах на Delphi,а
я изучаю C++Builder.Помогите мне пожалуйста
с материалом по данной теме или помогите
переделать код.:
uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,
Controls, Dialogs, SysUtils, OpenGL, Math;
Type
PGLVertex = ^TGLVertex;
TGLVertex = record
x,y,z : GLFloat;
end;
PGLVector = ^TGLVector;
TGLVector = array[0..2] of GLFloat;
PGLFace = ^TGLFace;
TGLFace = array[0..2] of GLInt;
PGLVertexArray = ^TGLVertexArray;
TGLVertexArray = array[Word] of TGLVertex;
PGLFacesArray = ^TGLFacesArray;
TGLFacesArray = array[word] of TGLFace;
TGLMesh = class
Vertices : PGLVertexArray;
Faces : PGLFacesArray;
FasetNormals : PGLVertexArray;
VertexCount : Integer;
FacesCount : Integer;
fExtent : GLFloat;
Extent : GLBoolean;
public
procedure LoadFromFile( const FileName : String );
procedure CalcNormals;
procedure Draw;
destructor Destroy; override;
end;
TGLMultyMesh = class
Meshes : TList;
CurrentFrame : Integer;
Action : Boolean;
fExtent : GLFloat;
Extent : Boolean;
public
procedure LoadFromFile( const FileName : String );
procedure Draw;
constructor Create;
destructor Destroy; override;
published
end;
implementation
procedure TGLMesh.CalcNormals;
var
i : Integer;
wrki, vx1, vy1, vz1, vx2, vy2, vz2 : GLfloat;
nx, ny, nz : GLfloat;
wrkVector : TGLVertex;
wrkVector1, wrkVector2, wrkVector3 : TGLVertex;
wrkFace : TGLFace;
begin
For i := 0 to FacesCount - 1 do begin
wrkFace := Faces[i];
wrkVector1 := Vertices[wrkFace[0]];
wrkVector2 := Vertices[wrkFace[1]];
wrkVector3 := Vertices[wrkFace[2]];
vx1 := wrkVector1.x - wrkVector2.x;
vy1 := wrkVector1.y - wrkVector2.y;
vz1 := wrkVector1.z*fExtent - wrkVector2.z*fExtent;
vx2 := wrkVector2.x - wrkVector3.x;
vy2 := wrkVector2.y - wrkVector3.y;
vz2 := wrkVector2.z - wrkVector3.z;
// вектор перпендикулярен центру треугольника
nx := vy1 * vz2 - vz1 * vy2;
ny := vz1 * vx2 - vx1 * vz2;
nz := vx1 * vy2 - vy1 * vx2;
// получаем унитарный вектор единичной длины
wrki := sqrt (nx * nx + ny * ny + nz * nz);
If wrki = 0 then wrki := 1; // для предотвращения деления на ноль
wrkVector.x := nx / wrki;
wrkVector.y := ny / wrki;
wrkVector.z := nz / wrki;
FasetNormals[i] := wrkVector;
end;
end;
procedure TGLMesh.LoadFromFile;
var
f : TextFile;
S : String;
i : Integer;
Vertex : TGLVertex;
Face : TGLFace;
MaxVertex : GLFloat;
begin
AssignFile(f,FileName);
Reset(f);
repeat
ReadLn(f, S);
until (S = "numverts numfaces") or eof(f);
// Читаем количество вершин и граней
Readln(f,VertexCount,FacesCount);
// Выделяем память для хранения сетки
GetMem(Vertices,VertexCount*SizeOf(TGLVertex));
GetMem(Faces,FacesCount*SizeOf(TGLFace));
GetMem(FasetNormals,FacesCount*SizeOf(TGLVector));
ReadLn(f, S);
ReadLn(f, S);
// Считываем вершины
for i := 0 to VertexCount - 1 do
begin
Readln(f,Vertex.x,Vertex.y,Vertex.z);
Vertices[i] := Vertex;
end;
ReadLn(f, S);
ReadLn(f, S);
// Считываем грани
for i := 0 to FacesCount - 1 do
begin
Readln(f,Face[0],Face[1],Face[2]);
Face[0] := Face[0] - 1;
Face[1] := Face[1] - 1;
Face[2] := Face[2] - 1;
Faces[i] := Face;
end;
CloseFile(f);
// Рассчитываем масштаб
MaxVertex := 0;
for i := 0 to VertexCount - 1 do
begin
MaxVertex := Max(MaxVertex,Vertices[i].x);
MaxVertex := Max(MaxVertex,Vertices[i].y);
MaxVertex := Max(MaxVertex,Vertices[i].z);
end;
fExtent := 1/MaxVertex;
CalcNormals;
end;
procedure TGLMesh.Draw;
var
i : Integer;
Face : TGLFace;
begin
for i := 0 to FacesCount - 1 do begin
glBegin(GL_TRIANGLES);
Face := Faces[i];
glNormal3fv(@FasetNormals[i]);
glVertex3fv(@Vertices[Face[0]]);
glVertex3fv(@Vertices[Face[1]]);
glVertex3fv(@Vertices[Face[2]]);
glEnd;
end;
end;
destructor TGLMesh.Destroy;
begin
FreeMem(Vertices,VertexCount*SizeOf(TGLVertex));
FreeMem(Faces,FacesCount*SizeOf(TGLFace));
FreeMem(FasetNormals,FacesCount*SizeOf(TGLVector));
end;
procedure TGLMultyMesh.LoadFromFile;
var
f : TextFile;
S : String;
procedure ReadNextMesh;
var
i : Integer;
Vertex : TGLVertex;
Face : TGLFace;
MaxVertex : GLFloat;
NextMesh : TGLMesh;
begin
NextMesh := TGLMesh.Create;
repeat
ReadLn(f, S);
until (S = "numverts numfaces") or eof(f);
// Читаем количество вершин и граней
Readln(f,NextMesh.VertexCount,NextMesh.FacesCount);
// Выделяем память для хранения сетки
GetMem(NextMesh.Vertices,NextMesh.VertexCount*SizeOf(TGLVertex));
GetMem(NextMesh.Faces,NextMesh.FacesCount*SizeOf(TGLFace));
GetMem(NextMesh.FasetNormals,NextMesh.FacesCount*SizeOf(TGLVector));
ReadLn(f,S); // Пропускаем строку Mesh vertices:
// Считываем вершины
for i := 0 to NextMesh.VertexCount - 1 do
begin
Readln(f,Vertex.x,Vertex.y,Vertex.z);
NextMesh.Vertices[i] := Vertex;
end;
ReadLn(f,S); // Пропускаем строку end vertices
ReadLn(f,S); // Пропускаем строку Mesh faces:
// Считываем грани
for i := 0 to NextMesh.FacesCount - 1 do
begin
Readln(f,Face[0],Face[1],Face[2]);
Face[0] := Face[0] - 1;
Face[1] := Face[1] - 1;
Face[2] := Face[2] - 1;
NextMesh.Faces[i] := Face;
end;
// Рассчитываем масштаб
MaxVertex := 0;
for i := 0 to NextMesh.VertexCount - 1 do
begin
MaxVertex := Max(MaxVertex,NextMesh.Vertices[i].x);
MaxVertex := Max(MaxVertex,NextMesh.Vertices[i].y);
MaxVertex := Max(MaxVertex,NextMesh.Vertices[i].z);
end;
NextMesh.fExtent := 1/MaxVertex;
NextMesh.CalcNormals;
Meshes.Add(NextMesh);
end;
begin
Meshes := TList.Create;
AssignFile(f,FileName);
Reset(f);
While not Eof(f) do begin
Readln(f,S);
if S = "New object" then ReadNextMesh;
end;
CloseFile(f);
end;
procedure TGLMultyMesh.Draw;
begin
if Extent then
begin
fExtent := TGLMesh(Meshes.Items[CurrentFrame]).fExtent;
glScalef(fExtent,fExtent,fExtent);
end;
TGLMesh(Meshes.Items[CurrentFrame]).Draw;
if Action then begin
inc(CurrentFrame);
if CurrentFrame > (Meshes.Count - 1) then CurrentFrame := 0;
end;
end;
constructor TGLMultyMesh.Create;
begin
Action := False;
CurrentFrame := 0;
end;
destructor TGLMultyMesh.Destroy;
Var i : Integer;
begin
for i := 0 to Meshes.Count - 1 do
begin
TGLMesh(Meshes.Items[i]).Destroy;
end;
Meshes.Free;
end;
end.
ЗАРАНЕЕ БЛАГОДАРЕН!!!
← →
cyborg © (2003-10-22 01:38) [1]Обычно проблема стоит наоборот :)
← →
misterix (2003-10-22 14:10) [2]Материал по данной проблеме лежит на Королевстве Дельфи в разделе Подземелье Магов
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c