Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OpenGl & *.gms [Delphi, Windows]


Страницы:   1 2

sco ©   (2005-11-21 21:08:00) 

У меня есть книга по 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-25 23:33:00) [1]

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


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

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


DR0N   (2005-11-25 20:30:00) [3]

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


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

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


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

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


DR0N   (2005-11-24 21:15:00) [6]

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

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

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


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


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

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


grouzd[E]v   (2005-11-24 19:19:00) [8]


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

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

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


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

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


sco   (2005-11-24 16:34:00) [10]

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


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

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


grouzd[E]v   (2005-11-24 15:23:00) [12]


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

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

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

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


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


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


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

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


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

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


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

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


XProger   (2005-11-23 18:39:00) [16]

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


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


> *500

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


sco   (2005-11-23 15:15:00) [18]

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

   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:00) [19]

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

   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;
Теперь освщение нормальное. Всем большое спасибо!


XProger   (2005-11-22 22:22:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо