![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нормаль в 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]Да правильно у тебя считается - обычное векторное произведение.
Учти только, что получаются не координаты точки, а составляющие единичного вектора.
И направление вектора зависит от порядка обхода вершин.