Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Расчет нормалей (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.032 c
1-1099387163
Ozone
2004-11-02 12:19
2004.11.14
Hint


14-1098796678
ЮрийК
2004-10-26 17:17
2004.11.14
Dеинсталяция проги из "Add/Remove Programs"


1-1099401216
Kat
2004-11-02 16:13
2004.11.14
Существует ли функция, которая по русски возвращает месяц


1-1099228145
buSel
2004-10-31 16:09
2004.11.14
Взаимодействие между формами


3-1097824876
nv
2004-10-15 11:21
2004.11.14
MIDAS - информация о клиенте.





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