![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGl & *.gms [Delphi, Windows]
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) для нормализования скалированных нормалей %)