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

Вниз

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

Наверх




Память: 0.6 MB
Время: 0.058 c
2-1153892180
LexXL
2006-07-26 09:36
2006.08.13
hex


15-1152874361
nikShev
2006-07-14 14:52
2006.08.13
Пиринговые сети


2-1153481890
WolfRamm
2006-07-21 15:38
2006.08.13
SQL Explorer


15-1152965102
Андрей Пазик
2006-07-15 16:05
2006.08.13
Вот ТАК! нужно бороться с коррупцией


4-1145539148
EarlVadim
2006-04-20 17:19
2006.08.13
Нет работает прокрутка в ScrollBar. Кто сталкивался?