Java Open GL照明问题

时间:2011-05-02 21:55:58

标签: java opengl

我刚开始学习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();
    }
}

1 个答案:

答案 0 :(得分:3)

尝试通过glNormal3f()添加一些多边形法线。

我认为你看到(0, 0, 1)的{​​{3}}。