Главная страница
    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.037 c
14-1098703907
Dimedrol
2004-10-25 15:31
2004.11.14
Windows XP Professional 64-bit Edition


1-1099231595
Валерий
2004-10-31 17:06
2004.11.14
Application.Terminate;


3-1097849034
SSGuest
2004-10-15 18:03
2004.11.14
Как в DBGrid е такую штуковину сделать...


4-1096899008
OlegL
2004-10-04 18:10
2004.11.14
Кассовые апараты


1-1098973712
debuger
2004-10-28 18:28
2004.11.14
Синхронизация по времени выполнения.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский