2014-12-03 57 views
1

我正在製作一款帶有跟隨凸輪的玩家的3D遊戲。在我開始使用真實模型之前,我使用了cube,並使用displaylist渲染它,​​並且它的一切都很好。但是,現在我正在導入更多頂點的完整3D模型,我查看了一些VBO。我有一個完整的VBO結構設置,我可以看到最初繪製的模型,但它被繪製在遊戲世界的中心。當我移動播放器時,模型不會像應該那樣翻譯。該模型不會移動其位置。動態移動VBO的問題

這裏是我最初用來繪製玩家爲矩形(工作)代碼:

public static void drawRectPrism(float centerx, float centery, float centerz, float length, float height, float width, float rx, float ry, float rz) 
{ 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    { 
     glTranslatef(centerx, centery, centerz); 
     glRotatef(rx, 1, 0, 0); 
     glRotatef(ry, 0, 1, 0); 
     glRotatef(rz, 0, 0, 1); 
     glTranslatef(-centerx, -centery, -centerz); 
     glTranslatef(-length/2f, -height/2f, -width/2f); 


     glBegin(GL_QUADS); 
     { 
      glColor3f(1.0f, 0, 0); 
      glVertex3f(centerx, centery, centerz); 
      glVertex3f(centerx + length, centery, centerz); 
      glVertex3f(centerx + length, centery + height, centerz); 
      glVertex3f(centerx, centery + height, centerz); 

      glColor3f(0, 1.0f, 0); 
      glVertex3f(centerx, centery, centerz + width); 
      glVertex3f(centerx + length, centery, centerz + width); 
      glVertex3f(centerx + length, centery + height, centerz + width); 
      glVertex3f(centerx, centery + height, centerz + width); 

      glColor3f(0, 0, 1.0f); 
      glVertex3f(centerx, centery, centerz); 
      glVertex3f(centerx, centery + height, centerz); 
      glVertex3f(centerx, centery + height, centerz + width); 
      glVertex3f(centerx, centery, centerz + width);   

      glColor3f(0, 1.0f, 1.0f); 
      glVertex3f(centerx + length, centery, centerz); 
      glVertex3f(centerx + length, centery + height, centerz); 
      glVertex3f(centerx + length, centery + height, centerz + width); 
      glVertex3f(centerx + length, centery, centerz + width); 

      glColor3f(1.0f, 1.0f, 0); 
      glVertex3f(centerx, centery, centerz); 
      glVertex3f(centerx + length, centery, centerz); 
      glVertex3f(centerx + length, centery, centerz + width); 
      glVertex3f(centerx, centery, centerz + width); 

      glColor3f(1.0f, 0, 1.0f); 
      glVertex3f(centerx, centery + height, centerz); 
      glVertex3f(centerx + length, centery + height, centerz); 
      glVertex3f(centerx + length, centery + height, centerz + width); 
      glVertex3f(centerx, centery + height, centerz + width);   
     } 
     glEnd(); 
    } 
    glPopMatrix(); 
} 

我嘗試了幾種不同的方法的地方比別人強,並可能實施可怕的編程結構,但我覺得它應該仍然有效。

第一次嘗試:適應矩形代碼加載我的頂點和模型,而不是特定的矩形verticies:

public void translate(float x, float y, float z, float rx, float ry, float rz) 
{ 

     File f = new File("graveDigga.obj"); 
     try{ 
      m = OBJLoader.loadModel(f); 
     } 
     catch(FileNotFoundException e) 
     { 
      e.printStackTrace(); 
      Display.destroy(); 
      System.exit(1); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
      Display.destroy(); 
      System.exit(1); 
     } 
     displayListChar = glGenLists(1); 
     glNewList(displayListChar, GL_COMPILE); 
     glMatrixMode(GL_MODELVIEW); 
     glPushMatrix(); 
     { 
      glTranslatef(x, y, z); 
      glRotatef(rx, 1, 0, 0); 
      glRotatef(ry, 0, 1, 0); 
      glRotatef(rz, 0, 0, 1); 
      //glTranslatef(-x, -y, -z); 
      //glTranslatef(-length/2f, -height/2f, -width/2f); 
      glBegin(GL_TRIANGLES); 
      for(Face face : m.faces) 
      { 
       Vector2f t1 = m.textures.get((int) face.textures.x - 1); 
       glTexCoord2f(t1.x +x ,1-(t1.y +y)); 
       Vector3f n1 = m.normals.get((int) face.normal.x-1); 
       glNormal3f(n1.x +x ,n1.y+y,n1.z +z); 
       Vector3f v1 = m.vertices.get((int) face.vertex.x-1); 
       glVertex3f(v1.x +x,v1.y+y,v1.z+z); 
       Vector2f t2 = m.textures.get((int) face.textures.y - 1); 
       glTexCoord2f(t2.x +x, 1 - (t2.y+y)); 
       Vector3f n2 = m.normals.get((int) face.normal.y-1); 
       glNormal3f(n2.x+x,n2.y+y ,n2.z+z); 
       Vector3f v2 = m.vertices.get((int) face.vertex.y-1); 
       glVertex3f(v2.x+x,v2.y+y ,v2.z+z); 
       Vector2f t3 = m.textures.get((int) face.textures.z - 1); 
       glTexCoord2f(t3.x +x, 1 - (t3.y +y)); 
       Vector3f n3 = m.normals.get((int) face.normal.z-1); 
       glNormal3f(n3.x+x,n3.y+y,n3.z +z); 
       Vector3f v3 = m.vertices.get((int) face.vertex.z-1); 
       glVertex3f(v3.x+x,v3.y+y,v3.z +z); 

      } 
      glEnd(); 
     } 
     glPopMatrix(); 

    //} 
    //glPopMatrix(); 
    build(); 
} 

我接下來試圖從這些數據創建一個VBO顯示模式和調用rander方法我的遊戲循環。在調用渲染之前,我會通過代碼來嘗試翻譯VBO的位置,但沒有發生任何事情。

glMatrixMode(GL_MODELVIEW); 
      glPushMatrix(); 
      { 
       //glLoadIdentity(); 
       glTranslatef(x,y,z); 
       glRotatef(rx, 1, 0, 0); 
       glRotatef(ry, 0, 1, 0); 
       glRotatef(rz, 0, 0, 1); 
       glTranslatef(-x,-y,-z); 
       glDrawArrays(GL_TRIANGLES, 0, m.faces.size() * 3); 

}

我或我不知道我是否應該使用着色器這個沒有,但我的一部分被質疑爲什麼很難在移動世界空間中的3D模型?有沒有一種混亂的方式更容易實現暫時的基礎?

回答

1

考慮到你是1個代表的新人,請點贊。寫得很好的問題:)。

我不確定是否應該使用着色器來處理這個問題,但我的一部分人質疑爲什麼很難在世界空間中移動3D模型?有沒有一種混亂的方式更容易實現暫時的基礎?

一個簡單的glTranslatef()調用應該足以移動一個對象,而簡單的glRotatef()調用將旋轉該對象。

例如,使用glRotatef(90,1,0,0)返回以下結果: enter image description here Wheras無線,草不旋轉在所有: enter image description here

同與船舶。使用glRotatef(40,-1,0,0)返回以下結果: enter image description here Wheras而不線它只返回平: enter image description here

顯然,這僅僅是個節距。 glRotatef(AmountToRotate,PITCH,YAW,ROLL)可以將船推到一邊,或者旋轉船。

足夠的旋轉。

對於渲染的草地上,我只是用這個:

public void render(){ 
    Main.TerrainDemo.shader.start(); 
    glPushMatrix(); 
    glDisable(GL_LIGHTING); 
    glTranslatef(location.x * TerrainDemo.scale, location.y, location.z * TerrainDemo.scale); 
    TexturedModel texturedModel = TerrainDemo.texModel; 
    RawModel model = texturedModel.getRawModel(); 
    GL30.glBindVertexArray(model.getVaoID()); 
    GL20.glEnableVertexAttribArray(0); 
    GL20.glEnableVertexAttribArray(1); 
    GL13.glActiveTexture(GL13.GL_TEXTURE0); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturedModel.getTexture().getID()); 
    glScalef(10f, 10f, 10f); 
    glColor4f(0, 0, 0, 0.5f); 
    glDrawElements(GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0); 
    GL20.glDisableVertexAttribArray(0); 
    GL20.glDisableVertexAttribArray(1); 
    GL30.glBindVertexArray(0); 
    glEnable(GL_LIGHTING); 
    glPopMatrix(); 
    Main.TerrainDemo.shader.stop(); 
} 

要通過它,你可能不會意識到/理解的代碼切,我基本上只是說的glTranslatef(location.x * TerrainDemo.scale, location.y,location.z * TerrainDemo.scale)是唯一設置位置的東西。翻譯後,我簡單地設置比例(大小),然後繪製它。

Wheras如果刪除的glTranslatef()線,全草將只呈現在同一個位置: enter image description here

因此,要回答你的問題: 使用這樣的(僞代碼)

PUSH MATRIX HERE (glPushMatrix) SO TO NOT SAVE THE CURRENT TRANSLATION 
USE GLTRANSLATEF ON LOCATION OF CURRENT OBJECT 
RENDER/DRAW OBJECT 
POP THE MATRIX 

不幸的是,通過你的代碼,我無法找到實際上導致它無法繪製的具體問題,這意味着我不能只說「有xxx代碼,它會工作」,但我希望它有助於如何移動/旋轉一個對象。

我正在使用VBOs就像渲染草,船和樹(雖然我使用顯示列表來表示地形,因爲我很懶)。 如果你想進一步討論任何事情,我的Skype是joehot200。