Главная страница
    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.46 MB
Время: 0.039 c
14-1098780784
Труп Васи Доброго
2004-10-26 12:53
2004.11.14
Перевод чисел из dec в hex и bin


14-1099038151
}|{yk
2004-10-29 12:22
2004.11.14
Умберто Эко. Имя розы.


1-1099401968
Жекасиымси
2004-11-02 16:26
2004.11.14
утилита FC


4-1096073306
tnx
2004-09-25 04:48
2004.11.14
IExplorer History


1-1099306249
miwa
2004-11-01 13:50
2004.11.14
А в dfm-файлах можно использовать define ы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский