2013-02-27 72 views
1

這是我遇到的一個大問題。LWJGL glTranslate做奇怪的事

我想使用glTranslate呈現多個圖塊,但是當我使用x,y座標來調用我的繪圖函數時,圖塊間隔很奇怪(我不需要空格)。

這是發生了什麼事。

Drawing multiple tiles but having problems

這裏是我的代碼:

抽獎:

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,0),(0,10),(0,30),(0,60)等的翻譯。

這很重要,因爲它允許你建立一個複雜的從一系列簡單的離散步驟轉化而來。但是,如果要渲染多個對象,每個對象都有自己的變換,則需要在每個對象之間進行某種形式的重置。

您可以重新初始化整個矩陣,但這有點不整潔,並且涉及到知道之前已經完成了其他變換(如相機等)。相反,您可以將當前矩陣「推」到堆棧中,執行任何您想要執行的局部轉換,渲染東西,然後「彈出」矩陣,以便您回到開始的位置,準備就緒渲染下一個對象。

我應該指出,所有這些功能在以後的GL版本中都不推薦使用。使用更現代化的API可以使用着色器,並且可以提供您需要計算的任何變換。

+0

謝謝你。這究竟做了什麼? – teenHack42 2013-02-27 13:10:29

+0

所有的opengl翻譯函數都是真正的矩陣計算。 OpenGL維護一堆轉換矩陣,並且您的轉換操作適用於該堆棧頂部的矩陣。 glPushMatrix將頂層矩陣的副本推送到堆棧,glPopMatrix將其移除。您可以將其視爲撤消機制。 – 2013-02-27 14:48:39