Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нормаль в OpenGL [Delphi, Windows]


max999 ©   (2005-10-11 11:37:00) 

Наверное ламерский вопросик :)
Как вычислить координаты нормали по 3 точкам?
Я делал так:

procedure GetFaceNormal(const x1, y1, z1, x2, y2, z2, x3, y3, z3: GLfloat; var nx, ny, nz: GLfloat);
var
 wrki, vx1, vy1, vz1, vx2, vy2, vz2: GLFloat;
 nxt, nyt, nzt: GLFloat;
begin
vx1:=x1-x2;
vy1:=y1-y2;
vz1:=z1-z2;
vx2:=x2-x3;
vy2:=y2-y3;
vz2:=z2-z3;
nxt:=vy1*vz2-vz1*vy2;
nyt:=vz1*vx2-vx1*vz2;
nzt:=vx1*vy2-vy1*vx2;
wrki:=Sqrt(nxt*nxt+nyt*nyt+nzt*nzt);
if wrki = 0 then wrki:=1;
nx:=nxt/wrki;
ny:=nyt/wrki;
nz:=nzt/wrki;
end;

но оно не работает, нормаль направлена из какого-то угла в центр треугольника. Освещение не просчитываеться как нужно... :(

Киньте, плиз, готовую ф-цию, если можно... Задолбался уже в Яндексе и Гугле искать!


max999   (2005-10-11 14:00:00) [1]

Огромное спасибо. Теперь все правильно рисуеться.


MBo   (2005-10-11 12:48:00) [2]

>конец - полученные координаты нормали
так у тебя видимо, та ошибка, о которой я сказал?

начало нормали для отрисовки - пусть будет вершина 1.
тогда ее конец - x1+nx, y1+ny, z1+nz

>да еще и направлена "наизнанку"...
еще раз - ПОРЯДОК обхода вершин задает направление нормали в одну из полуплоскостей
В данном случае просто знаки измени, а вообще нужно следить за единообразием порядка обхода (нумерации).


max999   (2005-10-11 12:32:00) [3]

Да, это радует, что правильно...
А как "визуализировать" этот вектор? У меня есть квадратный полигон, я беру 3 его стороны, вычисляю для них нормаль, потом рисую линию: одна из сторон - ее начало, конец - полученные координаты нормали. Линия явно не перпендикулярна полигону да еще и направлена "наизнанку"... Так должно быть?


MBo   (2005-10-11 12:24:00) [4]

Да правильно у тебя считается - обычное векторное произведение.
Учти только, что получаются не координаты точки, а составляющие единичного вектора.
И направление вектора зависит от порядка обхода вершин.


Наверх

Титульная страница Поиск, карта сайта Написать письмо