游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1109|回复: 0

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

[复制链接]

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2006-10-16 18:22: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教程中的法向量计算方法只适合于

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

形法向量用什么方法呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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