2014-12-03 58 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。