Текущий архив: 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.46 MB
Время: 0.039 c