请教NeHe教程中的法向量计算问题

wanggongming 2006-10-16 06:43:02
不知道大家发现一个问题没有,利用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教程中的法向量计算方法只适合于

三边长度差不多的三角形吗?如果是这样的话,那计算三边长度差别很大的三角

形法向量用什么方法呢?
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongmingwang 2006-10-17
  • 打赏
  • 举报
回复
在NeHe的教程中,函数的三个参数分别是所有顶点的X坐标分量、Y坐标分量、Z坐标分量,而不是三个坐标点!NeHe教程源代码如下:
void getNormal(GLfloat gx[3],GLfloat gy[3],GLfloat gz[3],GLfloat *ddnv)
  {
    GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;

    w0=gx[0]-gx[1]; w1=gy[0]-gy[1]; w2=gz[0]-gz[1];
    v0=gx[2]-gx[1]; v1=gy[2]-gy[1]; v2=gz[2]-gz[1];
    nx=(w1*v2-w2*v1);
    ny=(w2*v0-w0*v2);
    nz=(w0*v1-w1*v0);
    nr=sqrt(nx*nx+ny*ny+nz*nz);
    ddnv[0]=nx/nr; ddnv[1]=ny/nr; ddnv[2]=nz/nr;
  }
按照NeHe教程修改,计算法向量ComputeNormal(CVector3 * V1,CVector3 * V2,CVector3 * V3)源代码中
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;
部分有错误,修改后的代码如下
w0=V1->x-V2->x; w1=V1->y-V2->y; w2=V1->z-V2->z;
v0=V3->x-V2->x; v1=V3->y-V2->y; v2=V3->z-V2->z;
wanggongming 2006-10-17
  • 打赏
  • 举报
回复
你说的是不是对坐标点采用整型数,但是算得的结果采用浮点数?
syy64 2006-10-17
  • 打赏
  • 举报
回复
利用整型数计算,是否存在精度问题?

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧