テクスチャードキューブとライトを見る視点があるシーンを構築しようとしています。
発生するはずのことは、立方体がそのライトの下で(中心に対して)回転している間、ライトはキューブの上のどこかに留まる必要があるということです。
実際に起こっていることは、立方体が回転するとライトも回転するということです。
私はこれをグーグルで調べて同様のSOの質問を探してみましたが、役に立ったものは何も見つかりませんでした。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);
}
何が起こっているのか: