1

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);

回転した 3 つの側面のうちの 1 つを次に示します。 3つの間違った側面の1つ

ここに正しい唯一の側面があります唯一の正しい側

4

1 に答える 1

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();
}
于 2013-08-08T08:07:32.677 に答える