2015-05-11 46 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)通常正態分佈也應歸一化向量不是單位長度。

相關問題