Нормаль к треугольнику
Fido Themes (ru.opengl)
От: Serg Saveljev <Serg.Saveljev@p15.f20.n5052.z2.fidonet.org>
Тема: нормали
Дата: 16 февраля 2001 г. 1:34
>Hello All.
>Hикто не подскажет как посчитать нормаль к треугольнику? GL_AUTO_NORMAL
не
>помогает. Я понимаю, что к треугольнику перпендикулярному какой-либо оси
>подсчитать просто, а если он имеет произвольные коордитаты (к примеру 0,
1, 1,
>-1, 0.3, 1, 1, 0.8, 1)?
>/DemON
Hi!
const p3 polygon::CalcNormal() const
{
p3 u, v, n;
u = m_pVertex[1]->v - m_pVertex[0]->v;
v = m_pVertex[2]->v - m_pVertex[0]->v;
n = u | v;
n.Normalize();
return n;
}
const p3 operator-(const p3 &b) const { return p3(x - b.x,
y - b.y, z - b.z); }
const p3 operator|(const p3 &b) const { return p3(y*b.z - z*b.y,z*b.x
- x*b.z,x*b.y - y*b.x); }
Regards, Alex.

Serg Saveljev пишет в сообщении
SS>Hикто не подскажет как посчитать нормаль к треугольнику?
SS>GL_AUTO_NORMAL не помогает.
Это для кривых.
SS>Я понимаю, что к треугольнику перпендикулярному какой-либо оси
SS>подсчитать просто, а если он имеет произвольные коордитаты (к примеру
0,
SS>1, 1, -1, 0.3, 1, 1, 0.8, 1)?
glAux.vect3d есть? Там есть perpnorm.
Суть в следующем:
1)вычисляем два вектора сторон
2) Умножаем их векторно
3) нормализируем.
Вот процедуры:
void crossprod(GLdouble v1[3], GLdouble v2[3], GLdouble prod[3])
{
GLdouble p[3]; /* in case prod == v1 or v2 */
p[0] = v1[1]*v2[2] - v2[1]*v1[2];
p[1] = v1[2]*v2[0] - v2[2]*v1[0];
p[2] = v1[0]*v2[1] - v2[0]*v1[1];
prod[0] = p[0]; prod[1] = p[1]; prod[2] = p[2];
}
void normalize(GLdouble v[3])
{
GLdouble d;
d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
if (d == (GLdouble)0.0) {
error("normalize: zero length vector");
v[0] = d = (GLdouble)1.0;
}
d = (GLdouble)1/d;
v[0] *= d; v[1] *= d; v[2] *= d;
}
void diff3(GLdouble p[3], GLdouble q[3], GLdouble diff[3])
{
diff[0] = p[0] - q[0];
diff[1] = p[1] - q[1];
diff[2] = p[2] - q[2];
}
void perpnorm(GLdouble p1[3], GLdouble p2[3], GLdouble p3[3], GLdouble n[3])
{
GLdouble d1[3], d2[3];
diff3(p2, p1, d1);
diff3(p2, p3, d2);
crossprod(d1, d2, n);
normalize(n);
}
Alex, http://www.geocities.com/udodenko
Posted: 05.03.2k1
Author: FidoNet
<www.fido7.ru>
|
 |
 |
|