我正在使用OpenGL在Java中创建3D游戏引擎。我正在使用 slick 库来实现纹理。 我正在使用一种方法来创建矩形/方形棱柱(6 个正方形/矩形)。用同样的方法,我实现了纹理。
问题是棱镜的 5 个边渲染为 90 度旋转纹理。铺设地板时这并不重要,但由于我在砖墙纹理上使用它,所以看起来不太正确。
由于这是一堵墙,我只关心它的 4 个面。
墙壁纹理在棱镜的 3 条边上旋转 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);
这是三个旋转边之一:
这是唯一正确的一面:
最佳答案
我已经通过更改纹理坐标解决了这个问题。新的代码是这样的:
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();
}
关于java - OpenGL + Slick 加载的纹理正在旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18101044/