OpenGL перемещает квадроциклы

Итак, у меня есть проблема с моим двигателем, над которой я сейчас работаю:

img

Дело в том, что он должен генерировать из них платформу 16x16.

Это код, который создает кубы:

 private void render(){



        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
        for(int x=0; x<16; x++){
            for(int z=0; z<16; z++) {


                b.renderBlock(x, 0, z, texture);

            }
        }

        glMatrixMode( GL_MODELVIEW );
        GL11.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
        GL11.glEnable(GL_CULL_FACE);
        GL11.glLoadIdentity();

    }

Это должно отображать платформу блоков 16x16.

Block.java (b.renderblock)

package net.themorfeus.awesum.adventure.game;

import org.lwjgl.opengl.GL11;
import org.newdawn.slick.opengl.Texture;

public class Block {

    private float rquad = 0f;

    public void renderBlock(int posx, int posy, int posz, Texture t) {
        t.bind();
        //GL11.glLoadIdentity();                          // Reset The Current Modelview Matrix
        GL11.glTranslatef(posx,posy,posz);             // Move Right 1.5 Units And Into The Screen 6.0
        GL11.glRotatef(rquad,0.0f,0.0f,1.0f);               // Rotate The Quad On The X axis ( NEW )
        GL11.glColor3f(1.0f,1.0f,1.0f);                 // Set The Color To Blue One Time Only
        GL11.glBegin(GL11.GL_QUADS);                  // Draw A Quad
      //GL11.glColor3f(0.5f, 0.4f, 0.4f);             // Set The Color To Green
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f( 1f, 1f,-1f);         // Top Right Of The Quad (Top)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f(-1f, 1f,-1f);         // Top Left Of The Quad (Top)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f(-1f, 1f, 1f);         // Bottom Left Of The Quad (Top)
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f( 1f, 1f, 1f);         // Bottom Right Of The Quad (Top)

        //GL11.glColor3f(1.2f,0.5f,0.9f);             // Set The Color To Orange
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f( 1f,-1f, 1f);         // Top Right Of The Quad (Bottom)
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f(-1f,-1f, 1f);         // Top Left Of The Quad (Bottom)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f(-1f,-1f,-1f);         // Bottom Left Of The Quad (Bottom)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f( 1f,-1f,-1f);         // Bottom Right Of The Quad (Bottom)

        //GL11.glColor3f(1.0f,0.0f,0.0f);             // Set The Color To Red
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f( 1f, 1f, 1f);         // Top Right Of The Quad (Front)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f(-1f, 1f, 1f);         // Top Left Of The Quad (Front)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f(-1f,-1f, 1f);         // Bottom Left Of The Quad (Front)
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f( 1f,-1f, 1f);         // Bottom Right Of The Quad (Front)

        //GL11.glColor3f(1f,0.5f,0.0f);             // Set The Color To Yellow
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f( 1f,-1f,-1f);         // Bottom Left Of The Quad (Back)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f(-1f,-1f,-1f);         // Bottom Right Of The Quad (Back)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f(-1f, 1f,-1f);         // Top Right Of The Quad (Back)
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f( 1f, 1f,-1f);         // Top Left Of The Quad (Back)

        //GL11.glColor3f(0.0f,0.0f,0.3f);             // Set The Color To Blue
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f(-1f, 1f, 1f);         // Top Right Of The Quad (Left)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f(-1f, 1f,-1f);         // Top Left Of The Quad (Left)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f(-1f,-1f,-1f);         // Bottom Left Of The Quad (Left)
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f(-1f,-1f, 1f);         // Bottom Right Of The Quad (Left)

        //GL11.glColor3f(0.5f,0.0f,0.5f);             // Set The Color To Violet
        GL11.glTexCoord2f(0,0);
        GL11.glVertex3f( 1f, 1f,-1f);         // Top Right Of The Quad (Right)
        GL11.glTexCoord2f(1,0);
        GL11.glVertex3f( 1f, 1f, 1f);         // Top Left Of The Quad (Right)
        GL11.glTexCoord2f(1,1);
        GL11.glVertex3f( 1f,-1f, 1f);         // Bottom Left Of The Quad (Right)
        GL11.glTexCoord2f(0,1);
        GL11.glVertex3f( 1f,-1f,-1f);         // Bottom Right Of The Quad (Right)
        GL11.glEnd();
        //rquad+=0.0000001f;

    }




}

Он в основном рендерит квадратные блоки.


person themorfeus    schedule 31.03.2012    source источник
comment
Просто предложение: вам действительно следует избавиться от этого кода немедленного режима (glBegin()…glEnd()). Все эти накладные расходы на вызов функций достаточно плохи в нативном коде, пересечение границы JNI не делает его лучше. Используйте массивы вершин и объекты буфера вершин.   -  person datenwolf    schedule 31.03.2012


Ответы (1)


Вы должны окружить свой рисунок/перевод парой glPushMatrix-glPopMatrix.

person datenwolf    schedule 31.03.2012
comment
Эй, у меня еще одна проблема - мои блоки перекрываются. например, 2-й блок начинается с 1/3 первого и т. д. как это исправить? - person themorfeus; 31.03.2012
comment
Ваш блок имеет протяженность в 2 единицы в каждом направлении (от -1 до +1), поэтому вы должны перемещаться кратно 2. Кроме того, блоки центрируются вокруг локальной нулевой точки, поэтому ваш glTranslate должен перемещаться в позиции 2[x ,у,z] + 0,5. Совет профессионала: возьмите карандаш и бумагу и нарисуйте их руками. - person datenwolf; 31.03.2012