LWJGL glTranslate делает странные вещи

это большая проблема, с которой я столкнулся.

Я пытаюсь отобразить несколько плиток с помощью glTranslate, но когда я вызываю свою функцию рисования с координатами x, y, плитки расположены странно (мне не нужны пробелы).

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

Отрисовка нескольких плиток, но возникают проблемы

вот мой код:

Рисовать:

public void draw(float Xa, float Ya) {

    GL11.glTranslatef(Xa, Ya, 0);


    if(hasTexture) {
    Texture.bind();

    GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(0.5f, 0.5f, 1);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(0, 0);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(0, S);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(S, S);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(S, 0);

        GL11.glEnd();
    }

и мой код рендеринга:

public void a() throws IOException {
    GL11.glTranslatef(0, 0, -10);
    int x = 0;
    while (x < World.BLOCKS_WIDTH - 1) {
        int y = 0;
        while (y < World.BLOCKS_HEIGHT - 1) {
            blocks.b[data.blocks[x][y]].draw(x, y);
            y++;
        }
        x++;
}

ошибок нет (кроме видимых)


person grantperry    schedule 27.02.2013    source источник


Ответы (1)


Похоже, вы не инициализируете или не нажимаете/выталкиваете текущее преобразование. Таким образом, переводы будут накапливаться, производя эффект, который вы видите, удаляясь все дальше и дальше по мере того, как вы переводите все большие значения.

Допустим, ваши блоки находятся на расстоянии 10 единиц друг от друга. Первый рисуется с переводом (0, 0), затем следующий (0, 10), затем (0, 20), (0, 30) и т. д.

Однако по мере того, как переводы накапливаются в матрице представления, на самом деле вы получаете переводы (0,0), (0,10), (0,30), (0,60) и т. д.

Это важно, так как позволяет построить сложное преобразование из серии простых дискретных шагов. Однако, когда вы хотите отобразить несколько объектов, каждый со своим собственным преобразованием, вам нужно иметь некоторую форму сброса между каждым объектом.

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

Вместо этого вы можете «втолкнуть» текущую матрицу в стек, выполнить любые локальные преобразования, которые вы хотите сделать, отобразить материал, а затем «вытолкнуть» матрицу обратно, чтобы вы вернулись к тому, с чего начали, готовы к визуализации следующего. объект.

Я должен указать, что вся эта функциональность устарела в более поздних версиях GL. С более современным API вы используете шейдеры и можете предоставлять любые преобразования, которые хотите рассчитать.

person JasonD    schedule 27.02.2013
comment
все функции перевода opengl на самом деле являются матричными вычислениями. OpenGL поддерживает стек матриц перевода, и ваши операции преобразования применяются к матрице на вершине этого стека. glPushMatrix помещает копию самой верхней матрицы в стек, glPopMatrix удаляет ее. Вы можете думать об этом как о механизме отмены. - person Rolf Rander; 27.02.2013