2015-05-11 24 views
0

我正在用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行。我只是......无法弄清楚它的工作原理和原理。

有人可以解释它是如何计算的?

+7

您可以使用[跨产品(如此处所示)](https://math.stackexchange.com/questions/305642/how-to-find-surface-normal-of-a-triangle)计算法线, ,这基本上就是你的代码在做什么。 – CoryKramer

+1

这是关于计算曲面法线的,你可以在https://www.opengl.org/wiki/Calculating_a_Surface_Normal中看到。 – user1929959

+1

最后一行是计算[两个3向量的交叉乘积](http://en.wikipedia.org/wiki/Cross_product)。关于法线的计算我把你的答案http://stackoverflow.com/a/6661242/524368 – datenwolf

回答

3

正如Cyber​​在评论中所说的解决方案是计算交叉产品。数学描述为here

该代码将三角点转化为2个向量(从点1到点2和从点1到点3),然后它将它们并计算它们的叉积。

1

这是一个交叉产品。请注意,当(i0,j0,k0)中的向量(I,j,k)相乘时(乘积),结果为(jk0-kj0,ki0-ik0,ij0-ji0)通常正态分布也应归一化向量不是单位长度。

相关问题