游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2091|回复: 3

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

[复制链接]

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2006-10-16 18:24:00 | 显示全部楼层 |阅读模式
不知道大家发现一个问题没有,利用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教程中的法向量计算方法只适合于

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

形法向量用什么方法呢?

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-10-17 03:11:00 | 显示全部楼层

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

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=V2->x-V1->x; w1=V2->y-V1->y; w2=V2->z-V1->z;
v0=V3->x-V1->x; v1=V3->y-V1->y; v2=V3->z-V1->z;
Nehe的教程应该没有错,可能楼主看的不是原版的,请给明出处:)

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2006-10-17 10:19:00 | 显示全部楼层

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

是的,我自己理解错了,在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教程修改,代码和楼上的有些不同,如下
        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;

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-10-17 21:52:00 | 显示全部楼层

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

没关系,理解了就行了。

没必要每个实现都相同。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 15:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表