![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расчет нормалей (OpenGL) [Delphi, Windows]
Yurko © (2004-07-19 09:51:00)Привет!
Мне нужно нарисовать 3D "астероид" – некое объемное тело с плавными выпуклостями и впадинами.
За основу взял вот этот пример: http://delphigfx.mastak.ru/samples4.htm(Chrome 3DS face).
Вершины у меня есть, в треугольники их соединил, а вот как нормали рассчитать не знаю.
Может, я за основу не то взял и "астероид" лучше рисовать другим способом?
Помогите, пожалуйста, алгоритмом или советом.
Yurko (2004-07-20 12:57:00) [1]Спасибо огромное!!!
Белый Крыс (2004-07-20 12:07:00) [2]Вот процедура расчета нормалей для треугольника из книги Краснова по 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 10:28:00) [3]нашел вот что:
"..для каждого треугольника ищется нормаль. Для каждой вершины нормаль является усреднением нормалей треугольников, имеющих данную вершину..."
Помогите реализовать, пожалуйста.
Yurko (2004-07-20 10:11:00) [4]Нормали, я так думаю, не перпендикулярны треугольникам потому, что нужно сгладить переходы между гранями...
С примерами на С++ с http://www.euclideanspace.com/maths/algebra/vectors/normals/я не смог разобраться... :(
Если есть пример на Delphi или, еще лучше, просто формулы – помогите, пожалуйста.
Zer0 (2004-07-19 17:02:00) [5]Для расчета нормалей используются три точки в треугольнике. Только есть одно но - они должы быть расположены в определенном порядке, иначе нормаль вместо "наружу" будет направлена внутрь.
Более подробно можно прочитать тут:
http://www.euclideanspace.com/maths/algebra/vectors/normals/
ПсихЪ_задумчивый (2004-07-19 16:45:00) [6]Я так понимаю нормали можно расчитать по треугольникам, либо хранить вместе с вершинами в файле, если они у тебя не перпендикулярны треугольникам.