Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.061 c
7-1076329781
WebErr
2004-02-09 15:29
2004.04.18
Как перегрузить соседний компьютер?


1-1080828616
Alex_B
2004-04-01 18:10
2004.04.18
Подскажите пожалуйста новичку каким компонетом в Delphi


3-1079726314
san
2004-03-19 22:58
2004.04.18
Помогоите вывести формулу на экран?


1-1080804481
Layner
2004-04-01 11:28
2004.04.18
Закрасить фигуру TShape бело-синим, плавным перетоком


1-1080387964
KSergey
2004-03-27 14:46
2004.04.18
Как определить чего рисовать в OnPaint?