java - OpenGL + Slick 加载的纹理正在旋转

标签 java opengl textures slick2d

我正在使用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);

这是三个旋转边之一: One of the Three Wrong Sides

这是唯一正确的一面: The only Correct Side

最佳答案

我已经通过更改纹理坐标解决了这个问题。新的代码是这样的:

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/

相关文章:

ios - SpriteKit——SKTexture PreloadTextures EXC_BAD_ACCESS 崩溃

android - OpenGL ES 1.0 : Hide texture parts while textures overlapped

ios - 在cocos2d中用方形纹理填充多边形 Sprite

java - 强制重新加载 IntelliJ 中的环境变量...无需重新启动?

java - 由于 WebSocket session 已关闭,消息将不会发送

java - 使用 Jackson(Joda-Time 模块)进行 DateTime 反序列化的默认时区

c++ - 拖动时保持窗口事件(Win32 上的 SDL)

c++ - 如何正确链接 OpenGL 着色器的开放式 GL 法线

java - Bean validator 组件约束

c++ - dll注入(inject): drawing simple game overlay with opengl