Я пытаюсь построить сцену, в которой есть перспектива, смотрящая на текстурированный куб и источник света.
Что должно произойти, так это то, что источник света должен оставаться где-то над кубом, пока куб вращается (против его центра) под этим светом.
Что на самом деле происходит, так это то, что свет также вращается, когда вращается куб.помог.Следуя документации OpenGL, я понимаю, что на положение источника света влияют преобразования матрицы вида модели, но я также понимал, что нажатие / выталкивание матрицы до / после указанных преобразований приведет к тому, что они больше не будут воздействовать на свет.Однако я не могу заставить его работать, свет продолжает вращаться, независимо от того, изолирую ли я трансформации вида модели (для куба) в push / pop или если я загружу матрицу идентичности впоследствии.
Вот код (это на Java с использованием JOGL):
//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);
}
Вот что происходит: