2013-02-27 2 views
1

Это большая проблема, с которой я столкнулся.LWJGL glTranslate делает странные вещи

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

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

Drawing multiple tiles but having problems

вот мой код:

Draw:

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++; 
} 

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

ответ

4

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

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

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

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

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

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

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

+0

спасибо за это. что именно это делает? – teenHack42

+0

все функции перевода opengl - это действительно матричные вычисления. OpenGL поддерживает стек матриц трансакций, а ваши операции преобразования применяются к матрице в верхней части этого стека. glPushMatrix нажимает копию самой верхней матрицы на стек, glPopMatrix удаляет ее. Вы можете думать об этом как об отмене механизма. –

Смежные вопросы