Стоп свет от получения вершин преобразований - PullRequest
1 голос
/ 14 марта 2012

Я пытаюсь построить сцену, в которой есть перспектива, смотрящая на текстурированный куб и источник света.

Что должно произойти, так это то, что источник света должен оставаться где-то над кубом, пока куб вращается (против его центра) под этим светом.

Что на самом деле происходит, так это то, что свет также вращается, когда вращается куб.помог.Следуя документации 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);
}

Вот что происходит:

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

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Хорошо, я исправил это. Вот два важных момента:

  1. Как Люк упоминал в своем ответе, в моем коде нет ничего плохого в том, что касается преобразований. Так как трансформация влияет только на сетку, свет фактически остается неподвижным.

  2. Причина, по которой мой куб выглядит так, что вокруг него вращается свет (хотя на самом деле он все еще светится), одним словом, НОРМАЛЬНЫЕ.

Другими словами: это отсутствие объявления нормалей для лиц моего куба. Да, кто знал, я не сделал. Если у вас есть некоторые лица (например, треугольники и квадраты) и источник света, то, если вы не объявляете нормали, вы просто НЕ будете подвержены воздействию света. На них действительно влияют, но все это странно (как вы можете видеть из моих скриншотов в тексте вопроса).

Так что, в основном, я сделал, чтобы исправить это, посмотрите на урок Нехе (я люблю этих парней) 07:

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

В нижней части страницы у вас есть код для тонны языков и библиотек, я лично использовал версию JOGL, но любой из них подойдет.

Затем я также посмотрел документы OpenGL, чтобы посмотреть, как я могу объявить свои вершины / индексы / нормали как массивы (а не по отдельности):

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

0 голосов
/ 14 марта 2012

Попробуйте добавить glLoadIdentity () прямо перед вашим вторым glPushMatrix() вызовом:

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

Как видно из вашего исходного поста, эта пара push / pop ничего не делает. Между ними нет никаких матричных операций. glPushMatrix() не сбрасывает активную матрицу, она только сохраняет текущий набор значений, чтобы вы могли вернуться в это состояние.

Я не думаю, что ваша ошибка в коде, который вы опубликовали. Можете ли вы привести минимальный рабочий пример, который все еще демонстрирует вашу проблему?

...