2012-03-14 43 views
1

我正在嘗試構建一個場景,其中有一個透視看紋理的多維數據集和光。阻止獲取頂點轉換的光

應該發生的事情是光線應該保持在立方體上方的某個位置,而立方體在光線下方(相對於它的中心)旋轉。

實際情況是,當立方體旋轉時,燈光也會旋轉。

我試過用Google搜索這個,看起來類似的問題,但我沒有找到任何幫助。在OpenGL文檔之後,我瞭解到燈光位置受模型視圖矩陣變換的影響,但我也理解,在所述變換之前/之後推/拉矩陣將使得光線不再受其影響。然而,我無法做到這一點,無論我將模型視圖轉換(對於多維數據集)隔離爲推/拉還是後來加載了標識矩陣,光源都會繼續旋轉。

下面的代碼(它在使用JOGL的Java):

//this array goes into lightPositionBuffer 
private float[] lightPosition = {0, 0, 0, 1.0f}; 

public void display(GLAutoDrawable gLDrawable) { 
    //code for clearing screen, binding the textures, etc. 

    gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY); 
    gl.glFrontFace(GL2.GL_CCW); 
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, cubeVerticesBuffer); 
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, cubeTextureCoordsBuffer); 

    //rotate the cube 
    gl.glPushMatrix();  
    gl.glTranslatef(cubeCenterXInitial,cubeCenterYInitial,cubeCenterZInitial); 
    gl.glRotatef(rotationAmountY, 1, 0, 0); 
    gl.glTranslatef(-cubeCenterXInitial,-cubeCenterYInitial,-cubeCenterZInitial); 
    rotationAmountY+=1.5f; 
    gl.glDrawElements(GL.GL_TRIANGLE_STRIP, cubeIndexes.length, GL.GL_UNSIGNED_BYTE, cubeIndexesBuffer); 
    gl.glPopMatrix(); 

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY); 

    //Position The Light: 
    gl.glPushMatrix(); 
    //lightPositionBuffer is a FloatBuffer containing the lightPosition float array declared above: 
    gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer); 
    gl.glPopMatrix(); 
    //Enable Light 0 
    gl.glEnable(GL2.GL_LIGHT0); 
    gl.glEnable(GL2.GL_LIGHTING); 
} 

這裏的發生的事情:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

回答

1

好的,我修好了。這裏有兩點很重要:

  1. 由於盧克在他的回答中提到,就轉換而言,我的代碼沒有任何問題。事實上,變形隻影響網格,燈光仍然保持不變。

  2. 爲什麼它看起來像我的立方體有一個燈光在它周圍旋轉(實際上燈光仍然是),一句話就是NORMALS。

換句話說:這是我的立方體臉部缺少法線聲明。是的,誰知道,我沒有。當你有一些面孔(如三角形和四邊形)和光線時,不聲明法線不會讓你的表面不受光線的影響。他們實際上受到了影響,但這一切都很奇怪(正如您可以從問題文本的截圖中看到的那樣)。

所以基本上我做了什麼來解決這個問題是看訥河的(我愛那些傢伙)課07:

http://nehe.gamedev.net/tutorial/texture_filters_lighting__keyboard_control/15002/

在頁面的底部,有你的代碼爲一噸的語言和庫,我個人使用JOGL版本,但任何一個都會很好。

然後我又看了看OpenGL的文檔只是爲了看我怎麼可以宣佈我的頂點/索引/法線的陣列(而不是個別):

http://www.songho.ca/opengl/gl_vertexarray.html

0

嘗試添加glLoadIdentity()你的第二個glPushMatrix()呼叫前右:

gl.glPushMatrix(); 
gl.glLoadIdentity(); // This 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer); 
gl.glPopMatrix(); 

目前的情況是在你原來的職位,是推/流行對沒有做任何事情。它們之間沒有任何矩陣操作。 glPushMatrix()不重置有效矩陣,它只保留當前的一組值,因此您可以返回到該狀態。

我不認爲你的錯誤是在你發佈的代碼中。你能否提供一個仍然存在問題的最小工作示例?

+0

嗯,我嘗試添加該行存在和它的完全一樣的東西。除了已經展示的代碼之外,我只有用於設置upa JFrame的樣板,啓動OpenGL線程,沒有什麼有趣的(我認爲),但是非常糟糕,所以我也不會添加它。不過,我添加了截圖,展示了立方體在旋轉時如何變暗和點亮。 – 2012-03-14 11:40:19