我正在嘗試構建一個場景,其中有一個透視看紋理的多維數據集和光。阻止獲取頂點轉換的光
應該發生的事情是光線應該保持在立方體上方的某個位置,而立方體在光線下方(相對於它的中心)旋轉。
實際情況是,當立方體旋轉時,燈光也會旋轉。
我試過用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);
}
這裏的發生的事情:
嗯,我嘗試添加該行存在和它的完全一樣的東西。除了已經展示的代碼之外,我只有用於設置upa JFrame的樣板,啓動OpenGL線程,沒有什麼有趣的(我認爲),但是非常糟糕,所以我也不會添加它。不過,我添加了截圖,展示了立方體在旋轉時如何變暗和點亮。 – 2012-03-14 11:40:19