2013-11-22 2 views
1

Я пытаюсь научиться писать код, чтобы нарисовать куб и повернуть его. Я решил нарисовать их, используя треугольники, и после того, как я нарисовал три стороны куба, я быстро понял, что есть проблема, когда белая сторона куба будет перекрывать красные и синие лица, а синий будет перекрывать красное лицо.Проблемы с рисованием куба в LWJGL

Я заметил, что: - белое лицо обращается в последний раз - синее лицо обращается перед белым лицом - красное лицо обращается перед синим лицом

Я подозреваю, что это может быть причиной проблема, так как белый нарисован поверх синего и синего на красном.

Есть ли я на правильном пути? Может ли кто-нибудь помочь мне найти решение этой проблемы?

import org.lwjgl.LWJGLException; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

import static org.lwjgl.opengl.GL11.*; 

public class RubiksCube { 

    int angle = 0; 

    public void start() { 

     final int width = 800; 
     final int height = 600; 
     try { 
      Display.setDisplayMode(new DisplayMode(width, height)); 
      Display.create(); 
     } catch (LWJGLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      System.exit(0); 
     } 

     // init OpenGL here 

     while (!Display.isCloseRequested()) { 
      render(); 

      angle = (angle+1)%360; 
      Display.update(); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     Display.destroy(); 
    } 

    public void render(){ 

     float edgeLength= 20.0f; 
     edgeLength /= 2.0f; 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0.0f, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight(), 0.0f, -50.0f, 50.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear screen 
     glPushMatrix(); 
     glTranslatef((Display.getWidth()/2), (Display.getHeight()/2), 0.0f); 
     glRotatef(angle, 1.0f, 1.0f, 1.0f); 
     glBegin(GL_TRIANGLES); 

     //Back 

     glColor3f(1.0f, 0.0f, 0.0f); 
     glVertex3f(-edgeLength, edgeLength, edgeLength); 
     glVertex3f(-edgeLength, -edgeLength, edgeLength); 
     glVertex3f(edgeLength, -edgeLength, edgeLength); 
     glVertex3f(-edgeLength, edgeLength, edgeLength); 
     glVertex3f(edgeLength, edgeLength, edgeLength); 
     glVertex3f(edgeLength, -edgeLength, edgeLength); 

     //Front 

     glColor3f(0.0f, 0.0f, 1.0f); 
     glVertex3f(-edgeLength, edgeLength, -edgeLength); 
     glVertex3f(-edgeLength, -edgeLength, -edgeLength); 
     glVertex3f(edgeLength, -edgeLength, -edgeLength); 
     glVertex3f(-edgeLength, edgeLength, -edgeLength); 
     glVertex3f(edgeLength, edgeLength, -edgeLength); 
     glVertex3f(edgeLength, -edgeLength, -edgeLength); 

     // Right 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex3f(edgeLength, edgeLength, -edgeLength); 
     glVertex3f(edgeLength, -edgeLength, -edgeLength); 
     glVertex3f(edgeLength, -edgeLength, edgeLength); 
     glVertex3f(edgeLength, edgeLength, -edgeLength); 
     glVertex3f(edgeLength, edgeLength, edgeLength); 
     glVertex3f(edgeLength, -edgeLength, edgeLength); 

     glEnd(); 
     glPopMatrix(); 
    } 
} 

ответ

0

Запросить буфер глубины и включить проверку глубины через glEnable(GL_DEPTH_TEST).

Смежные вопросы