2013-08-07 135 views
1

我正在使用OpenGL在Java中创建3D游戏引擎。我正在使用光滑的库来实现纹理。 我正在使用一种方法来创建矩形/正方形棱镜(6个正方形/矩形)。在同样的方法中,我实现了纹理。OpenGL +光滑加载的纹理旋转

问题是棱镜的5面呈90度旋转纹理。它在地板上的时候并不重要,但是因为我在砖墙上使用它,所以看起来不正确。

由于这是一面墙,我只关心它的四面。

墙体纹理在棱镜的三侧呈90度旋转。并且仅在一侧呈现不旋转。

我无法解决问题。我是否需要更改纹理的实现方式?

以下是创建棱镜的方法。

public static void quadPrizm(float x, float y, float z, float sx, float sy, float sz, Texture tex){ 
    glPushMatrix(); 
    { 
     glTranslatef(x, y, z); 

     tex.bind(); 
     glBegin(GL_QUADS); 
     { 
      //ROTATED (WRONG) 
      glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, sz/2); 
      glTexCoord2f(0, 4); glVertex3f(sx/2, -sy/2, sz/2); 
      glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, sz/2); 
      glTexCoord2f(4, 0); glVertex3f(-sx/2, sy/2, sz/2); 

      //THE CORRECT SIDE 
      glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
      glTexCoord2f(0, 4); glVertex3f(-sx/2, sy/2, -sz/2); 
      glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, -sz/2); 
      glTexCoord2f(4, 0); glVertex3f(sx/2, -sy/2, -sz/2); 

      //ROTATED (WRONG) 
      glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
      glTexCoord2f(0, 4); glVertex3f(-sx/2, -sy/2, sz/2); 
      glTexCoord2f(4, 4); glVertex3f(-sx/2, sy/2, sz/2); 
      glTexCoord2f(4, 0); glVertex3f(-sx/2, sy/2, -sz/2); 

      //ROTATED (WRONG) 
      glTexCoord2f(0, 0); glVertex3f(sx/2, -sy/2, -sz/2); 
      glTexCoord2f(0, 4); glVertex3f(sx/2, -sy/2, sz/2); 
      glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, sz/2); 
      glTexCoord2f(4, 0); glVertex3f(sx/2, sy/2, -sz/2); 

      //BOTTOM SIDE 
      glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
      glTexCoord2f(0, 4); glVertex3f(sx/2, -sy/2, -sz/2); 
      glTexCoord2f(4, 4); glVertex3f(sx/2, -sy/2, sz/2); 
      glTexCoord2f(4, 0); glVertex3f(-sx/2, -sy/2, sz/2); 

      //TOP SIDE 
      glTexCoord2f(0, 0); glVertex3f(-sx/2, sy/2, -sz/2); 
      glTexCoord2f(0, 4); glVertex3f(sx/2, sy/2, -sz/2); 
      glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, sz/2); 
      glTexCoord2f(4, 0); glVertex3f(-sx/2, sy/2, sz/2); 
     } 
     glEnd(); 
    } 
    glPopMatrix(); 
} 

用下面这行代码,我创建了一个带有墙纹理的立方体。

Draw.cube(0, 10, 10, 5, 5, 5, wall); 

下面是三个旋转边的之一: One of the Three Wrong Sides

这里是只有一侧是正确的:我已经改变解决了这个问题 The only Correct Side

回答

0

纹理坐标。新代码是这样的:

public static void quadPrizm(float x, float y, float z, float sx, float sy, float sz, Texture tex){ 
glPushMatrix(); 
{ 
    glTranslatef(x, y, z); 

    tex.bind(); 
    glBegin(GL_QUADS); 
    { 
     //ROTATED (WRONG) 
     glTexCoord2f(4, 0); glVertex3f(-sx/2, -sy/2, sz/2); 
     glTexCoord2f(0, 0); glVertex3f(sx/2, -sy/2, sz/2); 
     glTexCoord2f(0, 4); glVertex3f(sx/2, sy/2, sz/2); 
     glTexCoord2f(4, 4); glVertex3f(-sx/2, sy/2, sz/2); 

     //THE CORRECT SIDE 
     glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
     glTexCoord2f(0, 4); glVertex3f(-sx/2, sy/2, -sz/2); 
     glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, -sz/2); 
     glTexCoord2f(4, 0); glVertex3f(sx/2, -sy/2, -sz/2); 

     //ROTATED (WRONG) 
     glTexCoord2f(4, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
     glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, sz/2); 
     glTexCoord2f(0, 4); glVertex3f(-sx/2, sy/2, sz/2); 
     glTexCoord2f(4, 4); glVertex3f(-sx/2, sy/2, -sz/2); 

     //ROTATED (WRONG) 
     glTexCoord2f(4, 0); glVertex3f(sx/2, -sy/2, -sz/2); 
     glTexCoord2f(0, 0); glVertex3f(sx/2, -sy/2, sz/2); 
     glTexCoord2f(0, 4); glVertex3f(sx/2, sy/2, sz/2); 
     glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, -sz/2); 

     //BOTTOM SIDE 
     glTexCoord2f(0, 0); glVertex3f(-sx/2, -sy/2, -sz/2); 
     glTexCoord2f(0, 4); glVertex3f(sx/2, -sy/2, -sz/2); 
     glTexCoord2f(4, 4); glVertex3f(sx/2, -sy/2, sz/2); 
     glTexCoord2f(4, 0); glVertex3f(-sx/2, -sy/2, sz/2); 

     //TOP SIDE 
     glTexCoord2f(0, 0); glVertex3f(-sx/2, sy/2, -sz/2); 
     glTexCoord2f(0, 4); glVertex3f(sx/2, sy/2, -sz/2); 
     glTexCoord2f(4, 4); glVertex3f(sx/2, sy/2, sz/2); 
     glTexCoord2f(4, 0); glVertex3f(-sx/2, sy/2, sz/2); 
     } 
     glEnd(); 
    } 
    glPopMatrix(); 
}