2013-03-09 26 views
0

我想讓我的燈光在OpenGL中工作,使用LWJGL作爲實現庫。我認爲我遇到的問題是我沒有正確設置法線,因此照明在某些角度不起作用。下面是我測試立方體代碼:OpenGL法線誤解?

glBegin(GL_QUADS); 

glColor3f(r,g,b); 

glNormal3f(position.x, position.y, position.z - radius - 0.1f); 
glVertex3f(position.x + radius, position.y + radius, position.z - radius); 
glVertex3f(position.x + radius, position.y - radius, position.z - radius); 
glVertex3f(position.x - radius, position.y - radius, position.z - radius); 
glVertex3f(position.x - radius, position.y + radius, position.z - radius); 

glNormal3f(position.x, position.y, position.z + radius + 0.1f); 
glVertex3f(position.x + radius, position.y + radius, position.z + radius); 
glVertex3f(position.x + radius, position.y - radius, position.z + radius); 
glVertex3f(position.x - radius, position.y - radius, position.z + radius); 
glVertex3f(position.x - radius, position.y + radius, position.z + radius); 

glNormal3f(position.x - radius - 0.1f, position.y, position.z); 
glVertex3f(position.x - radius, position.y + radius, position.z + radius); 
glVertex3f(position.x - radius, position.y - radius, position.z + radius); 
glVertex3f(position.x - radius, position.y - radius, position.z - radius); 
glVertex3f(position.x - radius, position.y + radius, position.z - radius); 

glNormal3f(position.x + radius + 0.1f, position.y, position.z); 
glVertex3f(position.x + radius, position.y + radius, position.z + radius); 
glVertex3f(position.x + radius, position.y - radius, position.z + radius); 
glVertex3f(position.x + radius, position.y - radius, position.z - radius); 
glVertex3f(position.x + radius, position.y + radius, position.z - radius); 

glNormal3f(position.x, position.y - radius - 0.1f, position.z); 
glVertex3f(position.x + radius, position.y - radius, position.z + radius); 
glVertex3f(position.x - radius, position.y - radius, position.z + radius); 
glVertex3f(position.x - radius, position.y - radius, position.z - radius); 
glVertex3f(position.x + radius, position.y - radius, position.z - radius); 

glNormal3f(position.x, position.y + radius + 0.1f, position.z); 
glVertex3f(position.x + radius, position.y + radius, position.z + radius); 
glVertex3f(position.x - radius, position.y + radius, position.z + radius); 
glVertex3f(position.x - radius, position.y + radius, position.z - radius); 
glVertex3f(position.x + radius, position.y + radius, position.z - radius); 

glEnd(); 
+1

所以......這是什麼* *咋辦做的,什麼是它實際上做什麼? – 2013-03-09 21:53:59

+0

我只是想確定我的法線是正確的,因爲我不是很明白如何計算它們......這是表面前的一個點?對 ? – 2013-03-09 21:55:35

+0

@PhilippeParé:不,它不是表面前的點,而是垂直於表面的方向,用長度爲1的矢量表示。可以使用跨越三角形的矢量的叉積在R 3中計算它們。 – datenwolf 2013-03-09 21:59:14

回答

1

法向量相對於頂點本身,總是歸一化(即:他們有一個長度)。

所以,像這樣的一行:

glNormal3f(position.x, position.y, position.z - radius - 0.1f); 

應改爲:

glNormal3f(0.0f, 0.0f, 1.0f);