Главная страница
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.059 c
1-1099066559
slim
2004-10-29 20:15
2004.11.14
TreeView


1-1099292775
snake1977
2004-11-01 10:06
2004.11.14
Таймер в потоке


14-1098964273
NewDelpher
2004-10-28 15:51
2004.11.14
Воруют ли деньги операторы сотовой связи?


3-1098085500
Ega23
2004-10-18 11:45
2004.11.14
В чём может быть дело???


14-1098776503
ИМХО
2004-10-26 11:41
2004.11.14
Проиграть DVD на CD-ROM-е