【发布时间】:2013-12-27 10:36:36
【问题描述】:
我有一个项目,我必须读取 OBJ 文件并使用 GLUT 显示模型。我很好地阅读和显示模型,但我无法让法线正常工作。我已将所有面保存在 3 个 vtx[] (=points) 数组的 Faces[] 数组中,该数组具有 x、y、z 和一个法线,也具有 x、y、z 坐标。我计算了对应于每个面的 3 个顶点中的每一个的 2 个向量,我得到它们的叉积,我对其进行归一化并将其 x、y、z 坐标添加到 Normal 参数(这样如果有多个对于每个顶点的法线,我们将它们添加到类似于所有法线向量的平均值的东西),然后我再次进行归一化。当我打印出一些法线坐标以查看会发生什么时,它会打印出 0,0,(奇怪的东西)为 x,y,z。无论如何,这是代码。
for (int i = 0 ; i<triangle_index; i++)
{
float ux,uy,uz,vx,vy,vz,nn,nx,ny,nz;
//get vectors from first vertex of face
ux= Faces[triangle_index].vtx[1].x - Faces[triangle_index].vtx[0].x ;
uy= Faces[triangle_index].vtx[1].y - Faces[triangle_index].vtx[0].y ;
uz= Faces[triangle_index].vtx[1].z - Faces[triangle_index].vtx[0].z ;
vx= Faces[triangle_index].vtx[2].x - Faces[triangle_index].vtx[0].x ;
vy= Faces[triangle_index].vtx[2].y - Faces[triangle_index].vtx[0].y ;
vz= Faces[triangle_index].vtx[2].z - Faces[triangle_index].vtx[0].z ;
//CrossProduct
nx = (uy*vz) - (vy*uz);
ny = (vx*uz) - (ux*vz);
nz = (ux*vy) - (uy*vx);
//Length
nn = sqrt((nx*nx)+(ny*ny)+(nz*nz));
//Normalize
nx = nx/nn;
ny = ny/nn;
nz = nz/nn;
//Save to Vertex.Normal (plus any previous data)
Faces[triangle_index].vtx[0].norm.x =(Faces[triangle_index].vtx[0].norm.x + nx);
Faces[triangle_index].vtx[0].norm.y =(Faces[triangle_index].vtx[0].norm.y + ny);
Faces[triangle_index].vtx[0].norm.z =(Faces[triangle_index].vtx[0].norm.z + nz);
//get length again
nn = sqrt((Faces[triangle_index].vtx[0].norm.x*Faces[triangle_index].vtx[0].norm.x)+(Faces[triangle_index].vtx[0].norm.y*Faces[triangle_index].vtx[0].norm.y)+(Faces[triangle_index].vtx[0].norm.z*Faces[triangle_index].vtx[0].norm.z));
//Normalize again
Faces[triangle_index].vtx[0].norm.x =(Faces[triangle_index].vtx[0].norm.x)/nn;
Faces[triangle_index].vtx[0].norm.y =(Faces[triangle_index].vtx[0].norm.y)/nn;
Faces[triangle_index].vtx[0].norm.z =(Faces[triangle_index].vtx[0].norm.z)/nn;
//---------------Same For Second Vertex of the Same Face---------------------------/
ux= Faces[triangle_index].vtx[2].x - Faces[triangle_index].vtx[1].x ;
uy= Faces[triangle_index].vtx[2].y - Faces[triangle_index].vtx[1].y ;
uz= Faces[triangle_index].vtx[2].z - Faces[triangle_index].vtx[1].z ;
vx= Faces[triangle_index].vtx[0].x - Faces[triangle_index].vtx[1].x ;
vy= Faces[triangle_index].vtx[0].y - Faces[triangle_index].vtx[1].y ;
vz= Faces[triangle_index].vtx[0].z - Faces[triangle_index].vtx[1].z ;
nx = (uy*vz) - (vy*uz);
ny = (vx*uz) - (ux*vz);
nz = (ux*vy) - (uy*vx);
nn = sqrt((nx*nx)+(ny*ny)+(nz*nz));
nx = nx/nn;
ny = ny/nn;
nz = nz/nn;
Faces[triangle_index].vtx[1].norm.x =(Faces[triangle_index].vtx[1].norm.x + nx);
Faces[triangle_index].vtx[1].norm.y =(Faces[triangle_index].vtx[1].norm.y + ny);
Faces[triangle_index].vtx[1].norm.z =(Faces[triangle_index].vtx[1].norm.z + nz);
nn =sqrt((Faces[triangle_index].vtx[1].norm.x*Faces[triangle_index].vtx[1].norm.x)+(Faces[triangle_index].vtx[1].norm.y*Faces[triangle_index].vtx[1].norm.y)+(Faces[triangle_index].vtx[1].norm.z*Faces[triangle_index].vtx[1].norm.z));
Faces[triangle_index].vtx[1].norm.x =(Faces[triangle_index].vtx[1].norm.x)/nn;
Faces[triangle_index].vtx[1].norm.y =(Faces[triangle_index].vtx[1].norm.y)/nn;
Faces[triangle_index].vtx[1].norm.z =(Faces[triangle_index].vtx[1].norm.z)/nn;
//------------------Again for number three--------------------------------
ux= Faces[triangle_index].vtx[0].x - Faces[triangle_index].vtx[2].x ;
uy= Faces[triangle_index].vtx[0].y - Faces[triangle_index].vtx[2].y ;
uz= Faces[triangle_index].vtx[0].z - Faces[triangle_index].vtx[2].z ;
vx= Faces[triangle_index].vtx[1].x - Faces[triangle_index].vtx[2].x ;
vy= Faces[triangle_index].vtx[1].y - Faces[triangle_index].vtx[2].y ;
vz= Faces[triangle_index].vtx[1].z - Faces[triangle_index].vtx[2].z ;
nx = (uy*vz) - (vy*uz);
ny = (vx*uz) - (ux*vz);
nz = (ux*vy) - (uy*vx);
nn = sqrt((nx*nx)+(ny*ny)+(nz*nz));
nx = nx/nn;
ny = ny/nn;
nz = nz/nn;
Faces[triangle_index].vtx[2].norm.x =(Faces[triangle_index].vtx[2].norm.x + nx);
Faces[triangle_index].vtx[2].norm.y =(Faces[triangle_index].vtx[2].norm.y + ny);
Faces[triangle_index].vtx[2].norm.z =(Faces[triangle_index].vtx[2].norm.z + nz);
nn = sqrt((Faces[triangle_index].vtx[2].norm.x*Faces[triangle_index].vtx[2].norm.x)+(Faces[triangle_index].vtx[2].norm.y*Faces[triangle_index].vtx[2].norm.y)+(Faces[triangle_index].vtx[2].norm.z*Faces[triangle_index].vtx[2].norm.z));
Faces[triangle_index].vtx[2].norm.x =(Faces[triangle_index].vtx[2].norm.x)/nn;
Faces[triangle_index].vtx[2].norm.y =(Faces[triangle_index].vtx[2].norm.y)/nn;
Faces[triangle_index].vtx[2].norm.z =(Faces[triangle_index].vtx[2].norm.z)/nn;
}
如果我添加这个循环只是为了看看在计算法线后会发生什么
for (int i =0 ; i<100;i++)
cout << "n "<< Faces[i].vtx[0].norm.x<< " "<< Faces[i].vtx[0].norm.x <<" "<< Faces[i].vtx[0].norm.x <<"\n";
我得到了 norm.x,y,z 的全零。 任何人都可以看到代码有什么问题吗?
【问题讨论】: