Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

OpenGl & *.gms   Найти похожие ветки 

 
sco ©   (2005-11-21 21:08) [0]

У меня есть книга по OpenGl Краснова, но там не написано как грузить gms файлы, я нашёл другую доку, применил, объект грузится, отображается, но не получается настроить нормали, объекты все чёрные как смоль. Я уже долго парюсь, но ничего не могу сделать, я ещё 11-классник, и поэтому высшей математикой не владею, и не знаю как расчитать эти нормали. Помогите пожалуйста или скажите что я делаю не так.


procedure LoadObjectFromFile(fileName: string; var obj: TGLMesh); // Загрузка файла
var
 f : TextFile;
 S : String;
 i : Integer;
 Vertex : TGLVertex;
 Face : TGLFace;
//  Normal: TGLVertex;
 MaxVertex : GLFloat;
begin
 AssignFile(f,FileName);
 Reset(f);

 // Пропускаем строки, пока не попадется "New object"
 repeat
   ReadLn(f, S);
 until (S = "New object") or eof(f);  // Читаем количество вершин и граней
 if s="New object" then
 begin
  ReadLn(f,s); // Пропускаем строку TriMesh()
  ReadLn(f,s); // Пропускаем строку numverts numfaces
  with obj do
  begin
   Readln(f,VertexCount,FacesCount);  // Выделяем память для хранения сетки

   GetMem(Vertices,VertexCount*SizeOf(TGLVertex));
   GetMem(Faces,FacesCount*SizeOf(TGLFace));
   GetMem(FasetNormals,FacesCount*SizeOf(TGLVertex));

   ReadLn(f, S); // Пропускаем строку "Mesh vertices"  // Считываем вершины
   for i := 0 to VertexCount - 1 do
   begin
     Readln(f,Vertex.x,Vertex.y,Vertex.z);
     Vertices[i] := Vertex;
   end;

   ReadLn(f, S); // Пропускаем строку "end vertices"
   ReadLn(f, S); // Пропускаем строку "Mesh faces"  // Считываем грани
   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);
   CalcNormals(obj);
{    ReadLn(f, S); // Пропускаем строку "end faces"
   ReadLn(f, S); // Пропускаем строку "Faset normals:"  // Считываем нормали
   for i := 0 to FacesCount - 1 do
   begin
     Readln(f,Normal.x,Normal.y,Normal.z);
     FasetNormals[i] := Normal;
   end;

{    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;}
 end;
end;
end;

procedure DrawObject(obj: TGLMesh);
var
 i : Integer;
 Face : TGLFace;
 dvig: single;
begin
 with obj do
 begin
   glColor3f(0,0,0);
   {if Extent then }
   fExtent:=0.005;
   dvig:=1;
   glTranslatef(dvig, dvig, 0.3);
   glScalef(fExtent,fExtent,fExtent);

   for i := 0 to FacesCount - 1 do
   begin
     glBegin(GL_TRIANGLES);
     Face := Faces[i];
      glNormal3fv(@FasetNormals[i]);
//       glNormal3d(0,0.02,0.01);
      glVertex3fv(@Vertices[Face[0]]);
      glVertex3fv(@Vertices[Face[1]]);
      glVertex3fv(@Vertices[Face[2]]);
     glEnd;
   end;
   glTranslatef(-dvig,-dvig, +1);
 end;
end;

procedure DestroyObject(var obj: TGLMesh);
begin
with obj do
begin
 FreeMem(Vertices,VertexCount*SizeOf(TGLVertex));
 FreeMem(Faces,FacesCount*SizeOf(TGLFace));
 FreeMem(FasetNormals,FacesCount*SizeOf(TGLVertex));
end;
end;

{procedure CalcNormals(obj: TGLMesh);
var
 i : Integer;
 wrki, vx1, vy1, vz1, vx2, vy2, vz2 : GLfloat;
 nx, ny, nz : GLfloat;
 minX: GlFloat;
 wrkVector : TGLVertex;
//  pwrkVector : ^TGLVector;
 wrkVector1, wrkVector2, wrkVector3 : TGLVertex;
//  pwrkVector1, pwrkVector2, pwrkVector3 : ^TGLVector;
begin
with obj do
begin
 For i := 0 to round (FacesCount / 3) - 1 do begin

    wrkVector1 := Vertices[i*3];
    wrkVector2 := Vertices[i*3+1];
    wrkVector3 := Vertices[i*3+2];
    minX:=min(min(vertices[i*3].x,vertices[i*3+1].x),vertices[i*3+2].x);
    nX:=(vertices[i*3].x+vertices[i*3+1].x+vertices[i*3+2].x)/3;

    ny:=(vertices[i*3].y+vertices[i*3+1].y+vertices[i*3+2].y)/3;
    nz:=(vertices[i*3].z+vertices[i*3+1].z+vertices[i*3+2].z)/3;

    FasetNormals[i]:=wrkVector;
 end;
end;
end;}

procedure CalcNormals(var obj: TGLMesh);
var
 i : Integer;
 wrki, vx1, vy1, vz1, vx2, vy2, vz2 : GLfloat;
 nx, ny, nz : GLfloat;
 wrkVertex : TGLVertex;
 wrkVertex1, wrkVertex2, wrkVertex3 : TGLVertex;
begin
with obj do
begin
 for i := 0 to round (obj.VertexCount / 3) - 1 do
 begin
    wrkVertex1:=Vertices[i*3];
    wrkVertex2:=Vertices[i*3+1];
    wrkVertex3:=Vertices[i*3+2];

    vx1 := wrkVertex1.x - wrkVertex2.x;
    vy1 := wrkVertex1.y - wrkVertex2.y;
    vz1 := wrkVertex1.z - wrkVertex2.z;

    vx2 := wrkVertex2.x - wrkVertex3.x;
    vy2 := wrkVertex2.y - wrkVertex3.y;
    vz2 := wrkVertex2.z - wrkVertex3.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; // для предотвращения деления на ноль

    wrkVertex.x := nx / wrki;
    wrkVertex.y := ny / wrki;
    wrkVertex.z := nz / wrki;
    FasetNormals[i].x:=wrkVertex;
 end;
end;
end;


 
DR0N ©   (2005-11-21 21:25) [1]


//----------------------------------------------------------------------------//
//DRON"s OpenGl Engine V 1.0  http://dronprogs.mirgames.ru                    //
//Copyright (C) 2005 Korotkov Andrew                                          //
//                                                                            //
//This program is free software; you can redistribute it and/or               //
//modify it under the terms of the GNU General Public License                 //
//as published by the Free Software Foundation; either version 2              //
//of the License, or (at your option) any later version.                      //
//                                                                            //
//This program is distributed in the hope that it will be useful,             //
//but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//GNU General Public License (http://www.gnu.org/copyleft/gpl.html)           //
//for more details.                                                           //
//----------------------------------------------------------------------------//
unit GL_Mesh_DMD;

interface
uses
 Classes, 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;

   TGLMultyMesh = class;

   TGLMesh = class
     Vertices : PGLVertexArray;
     Faces : PGLFacesArray;
     FasetNormals : PGLVertexArray;
     SmoothNormals : PGLVertexArray;
     Width,Height,Depth : GLFloat;
     VertexCount : Integer;
     FacesCount : Integer;
     fExtent,fExtentX,fExtentY,fExtentZ : GLFloat;
     ScaleType : byte;
     Parent : TGLMultyMesh;
     public
     procedure CalcNormals;
     procedure CalcSmoothNormals;
     procedure Draw(Smooth,Textured : Boolean);
     destructor Destroy; override;
   end;

   TGLMultyMesh = class
     Meshes : TList;
     CurrentFrame : Integer;
     fExtent,fExtentX,fExtentY,fExtentZ : GLFloat;
     ScaleType : byte;
     fSmooth : Boolean;
     fAllScale : GLFloat;
     TexVertices : PGLVertexArray;
     TexFaces : PGLFacesArray;
     TexVCount, TexFCount : Integer;
     TexturePresent : Boolean;
     public
     procedure LoadFromFile( const FileName : String );
     procedure Draw;
     constructor Create;
     destructor Destroy; override;
     published
   end;

   function Max(v1,v2:GLFloat):GLFloat;
   function Min(v1,v2:GLFloat) : GLFloat;

implementation
uses GlDrawFunc3D;
{------------------------------------------------------------------}
function Max(v1,v2:GLFloat) : GLFloat;
begin
 if v1 >= v2 then result := v1
 else result := v2;
end;
function Min(v1,v2:GLFloat) : GLFloat;
begin
 if v1 <= v2 then result := v1
 else result := v2;
end;
{------------------------------------------------------------------}
procedure TGLMesh.CalcSmoothNormals;
var i, j : integer;
Face : TGLFace;
length : single;
begin
for i:=0 to VertexCount - 1 do
 begin
  SmoothNormals[i].X:=0;
  SmoothNormals[i].Y:=0;
  SmoothNormals[i].Z:=0;
 end;

for i:=0 to FacesCount-1 do
begin
Face := Faces[i];
 for j:=0 to 2 do
  begin
  SmoothNormals[Face[j]].X:=SmoothNormals[Face[j]].X+FasetNormals[i].X;
  SmoothNormals[Face[j]].Y:=SmoothNormals[Face[j]].Y+FasetNormals[i].Y;
  SmoothNormals[Face[j]].Z:=SmoothNormals[Face[j]].Z+FasetNormals[i].Z;
  end;
end;

for i:=0 to VertexCount - 1 do
 begin
  length:=sqrt(sqr(SmoothNormals[i].X) + sqr(SmoothNormals[i].Y) + sqr(SmoothNormals[i].Z));
  SmoothNormals[i].X:=SmoothNormals[i].X/length;
  SmoothNormals[i].Y:=SmoothNormals[i].Y/length;
  SmoothNormals[i].Z:=SmoothNormals[i].Z/length;
 end;
end;
{------------------------------------------------------------------}
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 - wrkVector2.z;

    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);

    wrkVector.x := nx / wrki;
    wrkVector.y := ny / wrki;
    wrkVector.z := nz / wrki;

    FasetNormals[i] := wrkVector;
 end;
end;
{------------------------------------------------------------------}
procedure TGLMesh.Draw(Smooth, Textured: Boolean);
var
  i : Integer;
  Face,TexFace : TGLFace;
  TexVertex : TGLVertex;
begin
 for i := 0 to FacesCount - 1 do begin
   glBegin(GL_TRIANGLES);
     Face := Faces[i];
     if Smooth then begin
       glNormal3fv(@SmoothNormals[Face[0]]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[0]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[0]]);
       glNormal3fv(@SmoothNormals[Face[1]]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[1]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[1]]);
       glNormal3fv(@SmoothNormals[Face[2]]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[2]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[2]]);
     end else begin
       glNormal3fv(@FasetNormals[i]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[0]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[0]]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[1]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[1]]);
       if Textured then begin
          TexFace := Parent.TexFaces[i];
          TexVertex := Parent.TexVertices[TexFace[2]];
          _glTexCoord2f(TexVertex.x,1-TexVertex.y);
       end;
       glVertex3fv(@Vertices[Face[2]]);
     end;
   glEnd;
 end;
end;



 
DR0N ©   (2005-11-21 21:25) [2]


{------------------------------------------------------------------}
destructor TGLMesh.Destroy;
begin
  FreeMem(Vertices,VertexCount*SizeOf(TGLVertex));
  FreeMem(SmoothNormals,VertexCount*SizeOf(TGLVertex));
  FreeMem(Faces,FacesCount*SizeOf(TGLFace));
  FreeMem(FasetNormals,FacesCount*SizeOf(TGLVector));
end;
{------------------------------------------------------------------}
procedure TGLMultyMesh.LoadFromFile;
var
  OverallMaxVertex : single;
  f : TextFile;
  S : String;
  procedure ReadNextMesh(AParent : TGLMultyMesh);
    var
       i : Integer;
   Vertex : TGLVertex;
   Face : TGLFace;
   MaxVertex,MaxVertexX,MaxVertexY,MaxVertexZ : GLFloat;
       NextMesh : TGLMesh;

   MinX,MinY,MinZ,MaxX,MaxY,MaxZ :GLFloat;
    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.SmoothNormals,NextMesh.VertexCount*SizeOf(TGLVector));
       GetMem(NextMesh.Faces,NextMesh.FacesCount*SizeOf(TGLFace));
       GetMem(NextMesh.FasetNormals,NextMesh.FacesCount*SizeOf(TGLVector));

       ReadLn(f,S);

       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);
       ReadLn(f,S);

       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;

         NextMesh.CalcNormals;
         NextMesh.CalcSmoothNormals;

  MinX:=0.0;
  MinY:=0.0;
  MinZ:=0.0;
  MaxX:=0.0;
  MaxY:=0.0;
  MaxZ:=0.0;

  for i:=0 to NextMesh.VertexCount - 1 do
  begin
  MinX:=Min(MinX,NextMesh.Vertices[i].x);
  MinY:=Min(MinY,NextMesh.Vertices[i].Y);
  MinZ:=Min(MinZ,NextMesh.Vertices[i].Z);

  MaxX:=Max(MaxX,NextMesh.Vertices[i].x);
  MaxY:=Max(MaxY,NextMesh.Vertices[i].Y);
  MaxZ:=Max(MaxZ,NextMesh.Vertices[i].Z);
  end;

  NextMesh.Width := MaxX - MinX;
  NextMesh.Height:= MaxY - MinY;
  NextMesh.Depth := MaxZ - MinZ;

  MaxVertex := 0;

  for i := 0 to NextMesh.VertexCount - 1 do
    begin
      OverallMaxVertex := Max(OverallMaxVertex,NextMesh.Vertices[i].x);
      OverallMaxVertex := Max(OverallMaxVertex,NextMesh.Vertices[i].y);
      OverallMaxVertex := Max(OverallMaxVertex,NextMesh.Vertices[i].z);
    end;

  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;

  MaxVertexX := 0; MaxVertexY := 0; MaxVertexZ := 0;
  for i := 0 to NextMesh.VertexCount - 1 do
    begin
      MaxVertexX := Max(MaxVertexX,NextMesh.Vertices[i].x);
      MaxVertexY := Max(MaxVertexY,NextMesh.Vertices[i].y);
      MaxVertexZ := Max(MaxVertexZ,NextMesh.Vertices[i].z);
    end;
  NextMesh.fExtentX := 1/MaxVertexX; NextMesh.fExtentY := 1/MaxVertexY; NextMesh.fExtentZ := 1/MaxVertexZ;

NextMesh.Parent := AParent;
Meshes.Add(NextMesh);
    end;

  Procedure ReadTextureBlock;
  var
     i : Integer;
     Vertex : TGLVertex;
     Face : TGLFace;
  begin
    Readln(f,S);
    Readln(f,TexVCount,TexFCount);

    if Assigned(TexVertices) then FreeMem(TexVertices);
    if Assigned(TexFaces) then FreeMem(TexFaces);

    GetMem(TexVertices,TexVCount*SizeOf(TGLVertex));
    GetMem(TexFaces,TexFCount*SizeOf(TGLFace));

    Readln(f,S);

    if S <> "Texture vertices:" then begin
      TexturePresent := False;
      Exit;
    end;

    for i := 0 to TexVCount - 1 do begin
      Readln(f,Vertex.x,Vertex.y,Vertex.z);
      TexVertices[i] := Vertex;
    end;

    Readln(f,S);
    Readln(f,S);

    for i := 0 to TexFCount - 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;
      TexFaces[i] := Face;
    end;

    TexturePresent := True;
  end;

begin
  fAllScale:=0.0;
  OverallMaxVertex:=0.0;
  Meshes := TList.Create;
  AssignFile(f,FileName);
  Reset(f);
  While not Eof(f) do begin
    Readln(f,S);
    if S = "New object" then ReadNextMesh(Self);
    if S = "New Texture:" then ReadTextureBlock;
  end;
  CloseFile(f);
  fAllScale:=1/OverallMaxVertex;
end;
{------------------------------------------------------------------}
procedure TGLMultyMesh.Draw;
begin
glPushMatrix();

  case ScaleType of
  1: begin
      fExtent := TGLMesh(Meshes.Items[CurrentFrame]).fExtent;
      glScalef(fExtent,fExtent,fExtent);
     end;
  2: begin
      fExtentX := TGLMesh(Meshes.Items[CurrentFrame]).fExtentX;
      fExtentY := TGLMesh(Meshes.Items[CurrentFrame]).fExtentY;
      fExtentZ := TGLMesh(Meshes.Items[CurrentFrame]).fExtentZ;
      glScalef(fExtentX,fExtentY,fExtentZ);
     end;
   3: glScalef(fAllScale,fAllScale,fAllScale);
  end;//case

 TGLMesh(Meshes.Items[CurrentFrame]).Draw(fSmooth,TexturePresent);

glPopMatrix();
end;
{------------------------------------------------------------------}
constructor TGLMultyMesh.Create;
begin
 CurrentFrame := 0;
end;
{------------------------------------------------------------------}
destructor TGLMultyMesh.Destroy;
Var i : Integer;
begin
 for i := 0 to Meshes.Count - 1 do
     TGLMesh(Meshes.Items[i]).Destroy;
 Meshes.Free;
 TexVertices:=nil;
 TexFaces:=nil;
end;

end.


Наслаждайся....


 
XProger ©   (2005-11-21 21:55) [3]

Для расчёта нормалей высшая математика не нужна! Векторная агебра 8-9 класс.
Свет хоть включен?


 
grouzd[E]v ©   (2005-11-21 22:14) [4]

Нахер gms, не трать время, все равно выкинешь. Экспортируй сам.
Нормали в гугле видел, в той статейке тоже есть (а вот если будешь сам грузить, то эта проблема отпадает =) - ну это если нормали нужно ПРОСЧИТАТЬ ессно.
Если для макса - file > export > ascii (ase) или maxscript
На 11 класс можешь даже не списывать - даже и не посмотрят =)
                      Good Luck

ps с днем рождения, кстати =)

---
... we are walking on a thin line and you better avoid the risk ...


 
Кефир87 ©   (2005-11-21 22:31) [5]

А с чего бы об этом должно быть написано в Краснове? 8)
Вот здесь http://delphigfx.mastak.ru/3d/004/3d_4.htm все прекрасно про сей формат написано и нормали там есть, фасетный и сглаженные, ничего считать не надо.
А вот так можно расчитать нормали (фасетные), только если вершины в правильном порядке записаны 8)

procedure Normalize3f(var a:TVector);
 var d:Single;
begin
 d:=sqrt(sqr(a.x)+sqr(a.y)+sqr(a.z));
 if d = 0 then d :=1;
 a.x:=a.x/d;
 a.y:=a.y/d;
 a.z:=a.z/d;
end;

function DoTheNormal(A, B, C : TVector):TVector;
var
 vx1,vy1,vz1,vx2,vy2,vz2:Single;
begin
{
vx1 = A.x - B.x
vy1 = A.y - B.y
vz1 = A.z - B.z

vx2 = B.x - C.x
vy2 = B.y - C.y
vz2 = B.z - C.z

N.x = (vy1 * vz2 - vz1 * vy2)
N.y = (vz1 * vx2 - vx1 * vz2)
N.z = (vx1 * vy2 - vy1 * vx2)
}
vx1 := A.x - B.x;
vy1 := A.y - B.y;
vz1 := A.z - B.z;

vx2 := B.x - C.x;
vy2 := B.y - C.y;
vz2 := B.z - C.z;

Result.x := vy1 * vz2 - vz1 * vy2;
Result.y := vz1 * vx2 - vx1 * vz2;
Result.z := vx1 * vy2 - vy1 * vx2;

Normalize3f(Result);
end;


Думаю что

TVector = record
 x,y,z:sGLFloat;
end;

Объяснять не надо 8)


 
sco ©   (2005-11-22 16:01) [6]

Частично проблема решена, но теперь цвета либо чёрный, либо белый. Может Источник света слишком отдалён или что-нибудь такое. У меня на экране помещаются где-то 2.5*2.5 едениц координат (x*y). Я бы кинул скрин, но помоему форум это не поддерживает.


 
sco ©   (2005-11-22 16:01) [7]

Частично проблема решена, но теперь цвета либо чёрный, либо белый. Может Источник света слишком отдалён или что-нибудь такое. У меня на экране помещаются где-то 2.5*2.5 едениц координат (x*y). Я бы кинул скрин, но помоему форум это не поддерживает.


 
Кефир87 ©   (2005-11-22 17:38) [8]

Не мучай свет слишком сильно! Для начала сделай просто


glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);


Там по умолчанию источник находится где-то в безконечности и таких проблем как "Может Источник света слишком отдалён или что-нибудь такое" быть не должно.

PS форум и правда не поддерживает 8)


 
XProger ©   (2005-11-22 22:22) [9]

sco, glScale надеюсь не используешь? Если да, то пропиши glEnable(GL_NORMALIZE) для нормализования скалированных нормалей %)


 
sco ©   (2005-11-23 15:15) [10]

Проблему решил.

   wrki := sqrt (nx * nx + ny * ny + nz * nz);
   wrkVector.x := nx / wrki;
   wrkVector.y := ny / wrki;
   wrkVector.z := nz / wrki;

Изменил
wrki := sqrt (nx * nx + ny * ny + nz * nz)*500;
Теперь освщение нормальное. Всем большое спасибо!


 
sco ©   (2005-11-23 15:15) [11]

Проблему решил.

   wrki := sqrt (nx * nx + ny * ny + nz * nz);
   wrkVector.x := nx / wrki;
   wrkVector.y := ny / wrki;
   wrkVector.z := nz / wrki;

Изменил
wrki := sqrt (nx * nx + ny * ny + nz * nz)*500;
Теперь освщение нормальное. Всем большое спасибо!


 
Кефир87 ©   (2005-11-23 18:16) [12]


> *500

ё... Как же это у тебя так получилось то?!


 
XProger ©   (2005-11-23 18:39) [13]

Кефир87, через жопу, прямо откуда руки и растут ;)))
sco, перечитай мой предыдущий пост, юный математик блин ;)


 
sco ©   (2005-11-24 12:42) [14]

Насчёт цыфр, а с этими векторами не дружу! Даже праграфы геометрии перечитал, но чото связи особой не нашёл, мне бы чертежи, схемы, но я в книгах их пока не встречал.
Но проблемы не кончились. Я в 3дМаксе делаю объекты, переконвертирую, гружу прогой своей, она грузит только 1-ый объект! Меняю CurrentFrame грузит другие но все посередине! А мне что для каждой сцены процедуру размещения объектов писать!? Этот класс может сам сцену нарисовать, а то так не удобно, ведь координаты все есть. Или же подскажите что я делаю не так?


 
sco ©   (2005-11-24 12:42) [15]

Насчёт цыфр, а с этими векторами не дружу! Даже праграфы геометрии перечитал, но чото связи особой не нашёл, мне бы чертежи, схемы, но я в книгах их пока не встречал.
Но проблемы не кончились. Я в 3дМаксе делаю объекты, переконвертирую, гружу прогой своей, она грузит только 1-ый объект! Меняю CurrentFrame грузит другие но все посередине! А мне что для каждой сцены процедуру размещения объектов писать!? Этот класс может сам сцену нарисовать, а то так не удобно, ведь координаты все есть. Или же подскажите что я делаю не так?


 
Кефир87 ©   (2005-11-24 15:01) [16]


> Насчёт цыфр, а с этими векторами не дружу!


А придется подружиться, если с 3Д графикой решил разбираться. А еще с матрицами, плоскостями... и кучей еще чего...

На счет перемещения объектов я ничего не понял. Но думаю путь к решению идет через glTranslate*()...


 
grouzd[E]v ©   (2005-11-24 15:23) [17]


> [14] sco ©   (24.11.05 12:42)

Но проблемы не кончились. Я в 3дМаксе делаю объекты, переконвертирую, гружу прогой своей, она грузит только 1-ый объект! Меняю CurrentFrame грузит другие но все посередине! А мне что для каждой сцены процедуру размещения объектов писать!? Этот класс может сам сцену нарисовать, а то так не удобно, ведь координаты все есть. Или же подскажите что я делаю не так?

Вы все еще кипятите *.gms? Говорю ж - пиши свой

---
... we are walking on a thin line and you better avoid the risk ...


 
sco ©   (2005-11-24 16:34) [18]

Вы все еще кипятите *.gms? Говорю ж - пиши свой
Мне бы вначале с этим разобраться.
На счет перемещения объектов я ничего не понял. Но думаю путь к решению идет через glTranslate*()...
Я делаю - AAA.Draw; он мне рисует первый объект, ну допустим дуло от танка. И всё! Меняю CurrentFrame:=2 он мне рисует башню, но в том же месте! А двигать каждый кубик, или цилиндр это моразм, особенно при разных GlScale, подскажите что делать! Ведь gms - ов у меня будет много, и не смогу для каждого процедуру с glTranslate*()... писать. Мож у меня MEGA кривая?


 
sco ©   (2005-11-24 16:34) [19]

Вы все еще кипятите *.gms? Говорю ж - пиши свой
Мне бы вначале с этим разобраться.
На счет перемещения объектов я ничего не понял. Но думаю путь к решению идет через glTranslate*()...
Я делаю - AAA.Draw; он мне рисует первый объект, ну допустим дуло от танка. И всё! Меняю CurrentFrame:=2 он мне рисует башню, но в том же месте! А двигать каждый кубик, или цилиндр это моразм, особенно при разных GlScale, подскажите что делать! Ведь gms - ов у меня будет много, и не смогу для каждого процедуру с glTranslate*()... писать. Мож у меня MEGA кривая?


 
Кефир87 ©   (2005-11-24 18:11) [20]

Может с первого поста не всегда понятно... Но зачем два?!
Решение очень простое. Берем много gsm"ов с разными кусками модели, берем Delphi и пишем в нем простенький редактор, который загружает много этих моделек и позволяет их двигать по сцене, а затем сохраняет в один файл ТВОЕГО формата, где у всех кусков сетка вершин смещена туда куда надо. Я бы, наверно, так и сделал. Если будешь тупо копипэйстить код ничему не научишься 8)


 
grouzd[E]v ©   (2005-11-24 19:19) [21]


> Вы все еще кипятите *.gms? Говорю ж - пиши свой
> Мне бы вначале с этим разобраться.

Блин, это же ПРИМЕР. Ты с ним больше разбираться будешь чем писАть свой экспортер, точно тебе говорю - я тоже сначала упирался =)
А вообще тебе врядли кто с мегой поможет, ибо никто ей не пользуется (ну разве что сам автор =)
ps да, и это, ctrl+c/v нахер =)

---
... we are walking on a thin line and you better avoid the risk ...


 
Кефир87 ©   (2005-11-24 20:32) [22]


> grouzd[E]v ©   (24.11.05 19:19) [21]
>
>

А ты внимательно DRON"овский движок расмотрел? 8) Открой его DMD блокнотом 8) А еще из GSM анимацию выдергиваю. Ну в свой формат 8) Но у меня в GSM всегда только один объект хранится. Не вижу смысла в одном файле хранить все сцену...


 
DR0N ©   (2005-11-24 21:15) [23]

>Я делаю - AAA.Draw; он мне рисует первый объект, ну допустим дуло от танка. И >всё! Меняю CurrentFrame:=2 он мне рисует башню, но в том же месте! А двигать >каждый кубик, или цилиндр это моразм, особенно при разных GlScale, >подскажите что делать! Ведь gms - ов у меня будет много, и не смогу для >каждого процедуру с glTranslate*()... писать. Мож у меня MEGA кривая?

Уфф блин слушай посмотри вот это...
http://dronprogs.mirgames.ru/files/Sources/ask.rar ~2Mb
это конечно не на чистом OGL но юзает gms ака dmd $) Там много моделей и все вроде бегает %)

> Вы все еще кипятите *.gms? Говорю ж - пиши свой
> Мне бы вначале с этим разобраться.
gms в принципе не плохая идея и реализация, но то что подсовывает автор бажно и кривовато, я правил серьезные ошибки в самом скрипте и сильно дорабатывал сам юнит моделей что бы они были пригодны для нормального использования.


 
DR0N ©   (2005-11-24 21:17) [24]

Кстати всякие вектора и прочее описаны в учебнике по матану за 1 курс, можешь купить М.Л.Краснов Вся высшая математика том 1... Настольная книга 3D программиста имхо ;)


 
Кефир87 ©   (2005-11-25 17:47) [25]

А текстовой файл читается медленней чем бинарный из-за преобразований 8)


 
DR0N ©   (2005-11-25 20:30) [26]

Кефир87
Ну намного ли ;)


 
Кефир87 ©   (2005-11-25 20:38) [27]

Ну тогда еще один аргумент:
Single - 4 байта (F1)
-60.1884 - в текстовом виде 8 байт, а ведь бываю еще более монстроподобные цифры типа 0.808407187461853 (17 байт). Вот. 8)


 
DR0N ©   (2005-11-25 23:33) [28]

Ну тут соглашусь, вообще можно скрипт переправить что бы он в бинарник писал и все, делов то. У меня просто все в зазипованых паках храниться и прирост неощутим. Я сохраняю то только вертексы, фейсы и текстуры - один раз на модель, а в той меге что была изначально вообще жуть такая тварилась и еще анимация дергалась ;)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.044 c
4-1145441888
DmiSb
2006-04-19 14:18
2006.08.13
Нужен пример печати на матричный принтер по сети


6-1143447618
Некто_Аполло
2006-03-27 12:20
2006.08.13
Дозвон без соединения


2-1153996435
Crazy monkey
2006-07-27 14:33
2006.08.13
Вопрос по фильтру


15-1153386030
SerJaNT
2006-07-20 13:00
2006.08.13
БЛС


2-1153818848
linsa
2006-07-25 13:14
2006.08.13
Картинка из Access в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский