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

Вниз

Расчет нормалей (OpenGL)   Найти похожие ветки 

 
Yurko   (2004-07-19 09:51) [0]

Привет!
Мне нужно нарисовать 3D "астероид" – некое объемное тело с плавными выпуклостями и впадинами.
За основу взял вот этот пример: http://delphigfx.mastak.ru/samples4.htm (Chrome 3DS face).
Вершины у меня есть, в треугольники их соединил, а вот как нормали рассчитать не знаю.
Может, я за основу не то взял и "астероид" лучше рисовать другим способом?
Помогите, пожалуйста, алгоритмом или советом.


 
ПсихЪ_задумчивый   (2004-07-19 16:45) [1]

Я так понимаю нормали можно расчитать по треугольникам, либо хранить вместе с вершинами в файле, если они у тебя не перпендикулярны треугольникам.


 
Zer0 ©   (2004-07-19 17:02) [2]

Для расчета нормалей используются три точки в треугольнике. Только есть одно но - они должы быть расположены в определенном порядке, иначе нормаль вместо "наружу" будет направлена внутрь.

Более подробно можно прочитать тут:
http://www.euclideanspace.com/maths/algebra/vectors/normals/


 
Yurko   (2004-07-20 10:11) [3]

Нормали, я так думаю, не перпендикулярны треугольникам потому, что нужно сгладить переходы между гранями...
С примерами на С++ с http://www.euclideanspace.com/maths/algebra/vectors/normals/ я не смог разобраться... :(
Если есть пример на Delphi или, еще лучше, просто формулы – помогите, пожалуйста.


 
Yurko   (2004-07-20 10:28) [4]

нашел вот что:
"..для каждого треугольника ищется нормаль. Для каждой вершины нормаль является усреднением нормалей треугольников, имеющих данную вершину..."
Помогите реализовать, пожалуйста.


 
Белый Крыс ©   (2004-07-20 12:07) [5]

Вот процедура расчета нормалей для треугольника из книги Краснова по OpenGL:

type
 TVertex = record
   X, Y, Z : glFloat;
 end;
...
procedure CalcNormals(fVert1, fVert2, fVert3 : TVertex; var fNormal : TVertex);
var
 Qx, Qy, Qz, Px, Py, Pz : glFloat;
begin

 Qx := fVert2.X - fVert1.X;
 Qy := fVert2.Y - fVert1.Y;

 Qz := fVert2.Z - fVert1.Z;
 Px := fVert3.X - fVert1.X;
 Py := fVert3.Y - fVert1.Y;
 Pz := fVert3.Z - fVert1.Z;

 fNormal.X := Py*Qz - Pz*Qy;
 fNormal.Y := Pz*Qx - Px*Qz;
 fNormal.Z := Px*Qy - Py*Qx;  
end;

Первые три параметра - вершины треугольника.
В четвертый параметр будет записываться нормаль.
Для каждой вершины нормаль является усреднением нормалей треугольников, имеющих данную вершину
Хм. Я так понимаю, надо организовать два цикла

for i := 0 to VertexCount - 1 do
 for j := 0 to FaceCount - 1 do begin
 if (Face[j][0] = i) or     //если текущая i-тая вершина
    (Face[j][1] = i) or     //входит в треугольник Face[j], то..
    (Face[j][2] = i) then begin
   VertNormal[i].x := VertNormal[i].x + FaceNormal[j].x;
   VertNormal[i].y := VertNormal[i].y + FaceNormal[j].y;
   VertNormal[i].z := VertNormal[i].z + FaceNormal[j].z;
 end;
end;

Наверное так? Возможно, нужно потом делить на кол-во теугольников, в которые входит вершина.
Потом, делить каждую нормаль на её длину (нормализация).
Если я где-то ошибся, не вините строго ;)


 
Yurko   (2004-07-20 12:57) [6]

Спасибо огромное!!!



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

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
14-1098792989
yet another student
2004-10-26 16:16
2004.11.14
Виртульные машины Бека/Кнута


14-1098862725
Егор
2004-10-27 11:38
2004.11.14
Создание .exe файла.


1-1098374169
Checist [root]
2004-10-21 19:56
2004.11.14
Управление FlashGet


14-1098450829
BiN
2004-10-22 17:13
2004.11.14
У России все же будет свой процессор


4-1096986888
programania
2004-10-05 18:34
2004.11.14
Изменение кода при выполнении программы