我正在用C++编写3ds文件解析器。现在我工作的正常人,我发现这段代码的某处网络:有人可以解释在这个代码中法线是如何计算的?
void calculateNormals(vert a, vert b, vert c,GLfloat *nx,GLfloat *ny, GLfloat *nz){
GLfloat Qx, Qy, Qz, Px, Py, Pz;
GLfloat v1[3] = {a.x,a.y,a.z};
GLfloat v2[3] = {b.x,b.y,b.z};
GLfloat v3[3] = {c.x,c.y,c.z};
Qx = v2[0]-v1[0];
Qy = v2[1]-v1[1];
Qz = v2[2]-v1[2];
Px = v3[0]-v1[0];
Py = v3[1]-v1[1];
Pz = v3[2]-v1[2];
*nx = Py*Qz - Pz*Qy;
*ny = Pz*Qx - Px*Qz;
*nz = Px*Qy - Py*Qx;
}
我明白了几乎一切,除了最后3行。我只是......无法弄清楚它的工作原理和原理。
有人可以解释它是如何计算的?
您可以使用[跨产品(如此处所示)](https://math.stackexchange.com/questions/305642/how-to-find-surface-normal-of-a-triangle)计算法线, ,这基本上就是你的代码在做什么。 – CoryKramer
这是关于计算曲面法线的,你可以在https://www.opengl.org/wiki/Calculating_a_Surface_Normal中看到。 – user1929959
最后一行是计算[两个3向量的交叉乘积](http://en.wikipedia.org/wiki/Cross_product)。关于法线的计算我把你的答案http://stackoverflow.com/a/6661242/524368 – datenwolf