我刚开始学习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);
}
答案 0 :(得分:1)
计算顶点法线的方法是:
这个循环是一个很好的O(n)。这里要注意的一件事是,如果顶点是共享的,法线将像球体一样平滑。如果不共享顶点,则会在多维数据集上获得您想要的硬面。复制这样的顶点应该在之前完成。
如果您的问题是如何从正常变为彩色,那取决于您的照明等式!最简单的方法是:color = dot(normal,globallightdir)*globallightcolor
另一种方式是color = texturecubemap(normal)
。但是有无限的可能性!