请教NeHe教程中的法向量计算问题
不知道大家发现一个问题没有,利用Jeff Molofee(NeHe)的OPENGL教程中计算法
向量的方法,在计算三边长度差不多的三角形的情况下,法向量计算正确,当三
条边的长度差别比较大时,法向量计算就不再正确,我找了几个不同的三角形做
实验并且在三个顶点上把其向量分别绘制出来,发现存在这个问题。
主要代码如下:
// 计算三个顶点构成的三角形的法向量
CVector3 * CVector3::ComputeNormal(CVector3 * V1, CVector3 * V2,
CVector3 * V3)
{
float w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;
w0=V1->x-V1->y; w1=V2->x-V2->y; w2=V3->x-V3->y;
v0=V1->z-V1->y; v1=V2->z-V2->y; v2=V3->z-V3->y;
nx=(w1*v2-w2*v1);
ny=(w2*v0-w0*v2);
nz=(w0*v1-w1*v0);
nr=sqrt(nx*nx+ny*ny+nz*nz);
CVector3 * result=new CVector3(nx/nr,ny/nr,nz/nr);
return result;
}
//测试法向量计算
//绘制以(500.0,0.0,0.0)、(0.0,500.0,0.0)、(0.0,0.0,500.0)为顶点的三角
形,并在三个顶点把法向量绘制出来,此时法向量计算正常
CVector3 *PA=new CVector3(500.0,0.0,0.0);
CVector3 *PB=new CVector3(0.0,500.0,0.0);
CVector3 *PC=new CVector3(0.0,0.0,500.0);
glColor3f(1.0,0.0,0.0);
//绘制三角形
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(PA->x,PA->y,PA->z);
glVertex3f(PB->x,PB->y,PB->z);
glVertex3f(PC->x,PC->y,PC->z);
glEnd();
//计算并绘制法向量
CVector3 *NABC=CVector3::ComputeNormal(PA, PB, PC);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(PA->x,PA->y,PA->z);
glVertex3f(PA->x+NABC->x*500,PA->y+NABC->y*500,PA->z+NABC->z*500);
glEnd();
glBegin(GL_LINES);
glVertex3f(PB->x,PB->y,PB->z);
glVertex3f(PB->x+NABC->x*500,PB->y+NABC->y*500,PB->z+NABC->z*500);
glEnd();
glBegin(GL_LINES);
glVertex3f(PC->x,PC->y,PC->z);
glVertex3f(PC->x+NABC->x*500,PC->y+NABC->y*500,PC->z+NABC-
>z*500);
glEnd();
//绘制以(500.0,400.0,0.0)、(0.0,20.0,0.0)、(50.0,0.0,100.0)为顶点的三
角形,并在三个顶点把法向量绘制出来,此时法向量计算不正常
CVector3 *PA=new CVector3(500.0,400.0,0.0);
CVector3 *PB=new CVector3(0.0,20.0,0.0);
CVector3 *PC=new CVector3(50.0,0.0,100.0);
glColor3f(1.0,0.0,0.0);
//绘制三角形
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(PA->x,PA->y,PA->z);
glVertex3f(PB->x,PB->y,PB->z);
glVertex3f(PC->x,PC->y,PC->z);
glEnd();
//计算并绘制法向量
CVector3 *NABC=CVector3::ComputeNormal(PA, PB, PC);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINES);
glVertex3f(PA->x,PA->y,PA->z);
glVertex3f(PA->x+NABC->x*500,PA->y+NABC->y*500,PA->z+NABC->z*500);
glEnd();
glBegin(GL_LINES);
glVertex3f(PB->x,PB->y,PB->z);
glVertex3f(PB->x+NABC->x*500,PB->y+NABC->y*500,PB->z+NABC->z*500);
glEnd();
glBegin(GL_LINES);
glVertex3f(PC->x,PC->y,PC->z);
glVertex3f(PC->x+NABC->x*500,PC->y+NABC->y*500,PC->z+NABC-
>z*500);
glEnd();
不知道产生上述问题的原因是什么,难道NeHe教程中的法向量计算方法只适合于
三边长度差不多的三角形吗?如果是这样的话,那计算三边长度差别很大的三角
形法向量用什么方法呢?