2013-11-05 22 views
0

我有以下頂點的形狀和麪孔OpenGL的計算自定義形狀的普通

static Vec3f cubeVerts[24] = { 
{ -0.5, 0.5, -0.5 }, /* backside */ 
{ -0.5, -0.5, -0.5 }, 
{ -0.3, 4.0, -0.5 }, 
{ -0.3, 3.0, -0.5 }, 
{ -0.1, 5.5, -0.5 }, 
{ -0.1, 4.5, -0.5 }, 
{ 0.1, 5.5, -0.5 }, 
{ 0.1, 4.5, -0.5 }, 
{ 0.3, 4.0, -0.5 },   
{ 0.3, 3.0, -0.5 }, 
{ 0.5, 0.5, -0.5 }, 
{ 0.5, -0.5, -0.5 }, 

{ -0.5, 0.5, 0.5 }, /* frontside */ 
{ -0.5, -0.5, 0.5 }, 
{ -0.3, 4.0, 0.5 }, 
{ -0.3, 3.0, 0.5 }, 
{ -0.1, 5.5, 0.5 }, 
{ -0.1, 4.5, 0.5 }, 
{ 0.1, 5.5, 0.5 }, 
{ 0.1, 4.5, 0.5 }, 
{ 0.3, 4.0, 0.5 },   
{ 0.3, 3.0, 0.5 }, 
{ 0.5, 0.5, 0.5 }, 
{ 0.5, -0.5, 0.5 } 
}; 

static GLuint cubeFaces[] = { 
0, 1, 3, 2,  /*backfaces*/ 
2, 3, 5, 4, 
4, 5, 7, 6, 
6, 7, 9, 8, 
8, 9, 11, 10, 

12, 13, 15, 14, /*frontfaces*/ 
14, 15, 17, 16, 
16, 17, 19, 18, 
18, 19, 21, 20, 
20, 21, 23, 22, 

0, 2, 14, 12, /*topfaces*/ 
2, 4, 16, 14, 
4, 6, 18, 16, 
6, 8, 20, 18, 
8, 10, 22, 20, 

1, 3, 15, 13, /*bottomfaces*/ 
3, 5, 17, 15, 
5, 7, 19, 17, 
7, 9, 21, 19, 
9, 11, 23, 21, 

0, 1, 13, 12, /*sidefaces*/ 
10, 11, 23, 22 
}; 

,我想它的正常是這樣的:

static Vec3f cubeNorms[] = { 
{ 0, 1, 0 }, 
{ 0, 1, 0 }, 
{ 0, 1, 0 }, 
{ 0, 1, 0 } 
}; 

有人能告訴我如何計算它的正常值並將其放入一個數組中,這樣我就可以像這樣一起使用所有這些,我知道我的正常情況是錯誤的,因爲我的形狀上的照明不正確,我也不確定它的正確設置方式正常,只有一個例子很好,我一直在閱讀正常計算的堆並仍然無法弄清楚如何去做。

static void drawCube() 
{ 
//vertexes 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, cubeVerts); 
//norms 
glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT, 0, cubeNorms); 
//faces 
glDrawElements(GL_QUADS, 22 * 4, GL_UNSIGNED_INT, cubeFaces); 
} 
+0

使用索引繪圖,您需要每個頂點的法線 - 當面共享一個頂點時,您想要什麼行爲? –

+0

@Brett Hale,謝謝,形狀是一個連接面的曲線,我明白我必須爲每個頂點計算法線,但我不知道如何計算它,我可以告訴我一個頂點規範示例從我的代碼? – Mindless

回答

3

我會假設你的面孔是counter-clockwise front-facing - 我不知道,如果是這樣的話 - 和四邊形,當然,凸面和平面。

對於臉部,取頂點{0,1,2}。我不知道Vec3f規範(或者如果它是一個類或C結構),但是我們可以發現正常所有頂點與四:

Vec3f va = v0 - v1; // quad vertex 1 -> 0 
Vec3f vb = v2 - v1; // quad vertex 1 -> 2 
Vec3f norm = cross(vb, va); // cross product. 

float norm_len = sqrt(dot(norm, norm)); 
norm /= norm_len; // divide each component of norm by norm_len. 

這就給了你一個unit normal該面對。如果頂點是共享的,並且您希望使用光照爲模型提供曲率感知,則必須決定法線的什麼值應該「達成一致」。也許最好的出發點是簡單地取該頂點的面法線的平均值 - 並根據需要將結果重新縮放到單位長度。

+0

我認爲你的命令錯了,ccw面臨你的代碼會產生一個反向指向正常。否則當然是正確的答案。 –

+0

Goddamnit - fixed ... –

+0

@BrettHale謝謝Brett和Christian – Mindless