2014-10-30 58 views
0

我創建了一個繞着軌道移動的直升機,現在我遇到麻煩的是我們應該在遊戲中擁有2個光源,一個是複製太陽的光源我已經完成了它不太難),第二個是位於實際直升機本身的聚光燈。這基本上是我到目前爲止:通過C++ openGL創建直升機射燈

GLfloat specular2[] = { 1.0, 1.0, 1.0, 1.0 }; 
GLfloat position2[] = { vx, vy, vz, 1.0 }; 
glLightfv(GL_LIGHT2, GL_DIFFUSE, ambientLight); 
glLightfv(GL_LIGHT2, GL_SPECULAR, specular2); 
glLightfv(GL_LIGHT2, GL_POSITION, position2); 
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0f); 
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 100.0f); 
glEnable(GL_LIGHT2); 

但是,它不會做我注意到的任何事情。我已經做了大量關於燈光的研究,我似乎無法弄清楚。順便說一下(vx,vy,vz)是我希望光線位於直升機前方的當前位置。

回答

1

您使用GL_SPOT_EXPONENT的價值是非常大的:

glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 100.0f); 

這控制了迅速的強度從錐的中心下降。例如,當這個值爲100.0時,在離開圓錐中心僅10度的角度時,強度將下降到約20%。你可能想嘗試一個更小的值,看看它是否會給你一個更好的結果。

雖然沒有顯示價值,但這個調用只是從命名中看起來很可疑。它使用一個名爲ambientLight變量設置光源的漫反射組件:

glLightfv(GL_LIGHT2, GL_DIFFUSE, ambientLight); 

而且,你不指定聚光燈的方向。默認值是(0.0,0.0,-1.0)。除非直升機在Z軸負方向有任何東西,否則聚光燈不會照亮任何東西。如果默認值不是您想要的,您將需要指定GL_SPOT_DIRECTION

請注意,當指定光源位置和方向時應用當前的模型視圖變換也很重要。所以如果你的直升機被改造了,那麼在轉換已經建立並且在進行繪製調用之前指定聚光燈的位置/方向是最容易的。