2011-05-02 3 views
2

방금 ​​Open GL을 배우기 시작했고 도로 블록을 쳤습니다. 어떤 이유로 푸시되고 터진 행렬을 사용하여 회전하는 객체가 조명을 변환하는 것처럼 보입니다. 아무도 내가 뭘 잘못하고 있는지 알아? glNormal3f()를 통해 일부 다각형 법선을 추가Java Open GL 조명 문제

import java.nio.FloatBuffer; 

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

public class DisplayExample { 

    int cube; 
    private FloatBuffer pos; 
    private int cube2; 

    public void start() { 
     int width=800; 
     int height=600; 
     try { 
      Display.setDisplayMode(new DisplayMode(width, height)); 
      Display.setTitle("Abarrow"); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 

     //setup colors 
     FloatBuffer red= BufferUtils.createFloatBuffer(4).put(new float[] { 1, 0, 0, 1}); 
     FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0, 1, 0, 1}); 
     FloatBuffer blue= BufferUtils.createFloatBuffer(4).put(new float[] { 0, 0, 1, 1}); 
     FloatBuffer yellow= BufferUtils.createFloatBuffer(4).put(new float[] { 1, 1, 0, 1}); 
     red.flip(); 
     green.flip(); 
     blue.flip(); 
     yellow.flip(); 
     //setup positions 
     pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); 
     pos.flip(); 

     //projection 
     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadIdentity(); 
     GL11.glFrustum(-4, 4, -3, 3, 5, 60); 
     //model view 
     GL11.glMatrixMode(GL11.GL_MODELVIEW); 
     GL11.glLoadIdentity(); 
     GL11.glTranslatef(0, 0, -10); 
     //light source 
     GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, pos); 
     //lighting 
     GL11.glEnable(GL11.GL_LIGHTING); 
     GL11.glEnable(GL11.GL_LIGHT0); 
     //other 
     GL11.glEnable(GL11.GL_DEPTH_TEST); 
     GL11.glEnable(GL11.GL_NORMALIZE); 


     cube=GL11.glGenLists(1); 
     GL11.glNewList(cube, GL11.GL_COMPILE); 
     GL11.glShadeModel(GL11.GL_SMOOTH); 
     GL11.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, green); 
     createCube(); 
     GL11.glEndList(); 

     cube2=GL11.glGenLists(1); 
     GL11.glNewList(cube2, GL11.GL_COMPILE); 
     GL11.glShadeModel(GL11.GL_SMOOTH); 
     GL11.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, red); 
     createCube(); 
     GL11.glEndList(); 

     loop(); 
    } 

    private void createCube() { 
     GL11.glBegin(GL11.GL_QUADS); 
     //front 
     GL11.glVertex3f(-1,-1,-1); 
     GL11.glVertex3f(-1,1,-1); 
     GL11.glVertex3f(1,1,-1); 
     GL11.glVertex3f(1,-1,-1); 
     //back 
     GL11.glVertex3f(-1,-1,1); 
     GL11.glVertex3f(-1,1,1); 
     GL11.glVertex3f(1,1,1); 
     GL11.glVertex3f(1,-1,1); 
     //left 
     GL11.glVertex3f(-1,-1,-1); 
     GL11.glVertex3f(-1,1,-1); 
     GL11.glVertex3f(-1,1,1); 
     GL11.glVertex3f(-1,-1,1); 
     //right 
     GL11.glVertex3f(1,-1,-1); 
     GL11.glVertex3f(1,1,-1); 
     GL11.glVertex3f(1,1,1); 
     GL11.glVertex3f(1,-1,1); 
     GL11.glEnd();  
    } 

    private void loop() { 
     float spot=0; 
     while (!Display.isCloseRequested()) { 
      spot+=1; 
      // Clear the screen and depth buffer 
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

      //reset model view 
      GL11.glMatrixMode(GL11.GL_MODELVIEW); 
      GL11.glLoadIdentity(); 
      GL11.glTranslatef(0, 0, -10); 
      GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, pos); 

      //cube 
      GL11.glPushMatrix(); 
      GL11.glTranslatef(-2, 0, 0); 
      GL11.glRotatef(spot, 0, 1, 0); 
      //render cube 
      GL11.glCallList(cube); 
      //undo transform 
      GL11.glPopMatrix(); 

      //cube2 
      GL11.glPushMatrix(); 
      GL11.glTranslatef(2, 0, 0); 
      GL11.glRotatef(-spot, 0, 1, 0); 
      //render cube 
      GL11.glCallList(cube2); 
      //undo transform 
      GL11.glPopMatrix(); 


      //render the graphics 
      Display.update(); 
      //cap at 60 fps 
      Display.sync(60); 
     } 

     Display.destroy(); 
    } 

    public static void main(String[] argv) { 
     DisplayExample displayExample = new DisplayExample(); 
     displayExample.start(); 
    } 
} 
+0

다각형 법선이 없으므로 조명이 작동하는 것처럼 보이기 때문에 놀랐습니다. – genpfault

답변

관련 문제