在opengl c ++中计算顶点法线(gouraud着色)

时间:2015-05-08 04:18:57

标签: c++ opengl vector

我刚开始学习C ++和OpenGL。我正在尝试在OpenGL中计算顶点法线。

我知道有一个函数glNormal3f。但是,我不允许使用该功能。相反,我必须用代码和obj文件计算顶点法线。所以我要做的是,我首先计算表面法线,然后计算顶点法线。

我声明了+,-,*等运算符以及innerproduct, crossproduct等其他函数。

void calcul_color(){
VECTOR kd;
VECTOR ks;
kd=VECTOR(0.8, 0.8, 0.8);
ks=VECTOR(1.0, 0.0, 0.0);
double inner =  kd.InnerProduct(ks);

int i, j;
for(i=0;i<cube.vertex.size();i++)
{
    VECTOR n = cube.vertex_normal[i];
    VECTOR l = VECTOR(100,100,0) - cube.vertex[i];
    VECTOR v = VECTOR(0,0,1) - cube.vertex[i];
    float xl = n.InnerProduct(l)/n.Magnitude();
    VECTOR x = (n * (1.0/ n.Magnitude())) * xl;
    VECTOR r = x - (l-x);

    VECTOR color = kd * (n.InnerProduct(l)) + ks * pow((v.InnerProduct(r)),10);
    cube.vertex_color[i] = color;
}




for(i=0;i<cube.face.size();i++)
    {
        FACE cur_face = cube.face[i];

glColor3f(cube.vertex_color[cur_face.id1].x,cube.vertex_color[cur_face.id1].y,cube.vertex_color[cur_face.id1].z);
            glVertex3f(cube.vertex[cur_face.id1].x,cube.vertex[cur_face.id1].y,cube.vertex[cur_face.id1].z);
            glColor3f(cube.vertex_color[cur_face.id2].x,cube.vertex_color[cur_face.id2].y,cube.vertex_color[cur_face.id2].z);
            glVertex3f(cube.vertex[cur_face.id2].x,cube.vertex[cur_face.id2].y,cube.vertex[cur_face.id2].z);
            glColor3f(cube.vertex_color[cur_face.id3].x,cube.vertex_color[cur_face.id3].y,cube.vertex_color[cur_face.id3].z);
            glVertex3f(cube.vertex[cur_face.id3].x,cube.vertex[cur_face.id3].y,cube.vertex[cur_face.id3].z);
    }

1 个答案:

答案 0 :(得分:1)

计算顶点法线的方法是:

  • 将每个顶点法线初始化为(0,0,0)
  • 对于每个面部计算面法线fn,将其标准化
  • 对于脸部的每个顶点,将fn添加到顶点法线
  • 在该循环之后标准化每个顶点正常

这个循环是一个很好的O(n)。这里要注意的一件事是,如果顶点是共享的,法线将像球体一样平滑。如果不共享顶点,则会在多维数据集上获得您想要的硬面。复制这样的顶点应该在之前完成。

如果您的问题是如何从正常变为彩色,那取决于您的照明等式!最简单的方法是:color = dot(normal,globallightdir)*globallightcolor 另一种方式是color = texturecubemap(normal)。但是有无限的可能性!