使用轻量级Java游戏库(LWJGL)的3D对象所需的建议

时间:2011-10-30 15:38:28

标签: java lwjgl

我花了大约2天试图找出如何使用lwjgl制作3d对象,并且什么都没发现。我可以轻松渲染2d对象,当我尝试渲染3d对象时,程序崩溃,或者打开黑屏,现在,我正在使用Eclipse,我正在那个环境中运行它(我不是我知道这是不是问题)。如果有人可以指出我做一个好的教程,或者只是给我一个解释我做错了什么,那将不胜感激。这是我的代码:

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

    public class Objects {
        public static void main(String[] args) {
            Objects objects = new Objects();
            objects.start();
        }

        public void start() {
            try {
                Display.setDisplayMode(new DisplayMode(800, 600));
                Display.create();
            } catch (LWJGLException e) {
                e.printStackTrace();
                System.exit(0);
            }

            initGL();

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

                Display.update();
            }

            Display.destroy();
        }

        public void initGL() {
            GL11.glMatrixMode(GL11.GL_PROJECTION);
            GL11.glLoadIdentity();
            GL11.glOrtho(0, 800, 600, 0, 1, -1);
            GL11.glMatrixMode(GL11.GL_MODELVIEW);

            return;
        }

        public void cube() {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

            //front face

            GL11.glColor3d(0.0, 1.0, 1.0);
            GL11.glVertex3d(1.0, 1.0, -1.0);
            GL11.glVertex3d(-1.0, 1.0, -1.0);
            GL11.glVertex3d(-1.0, -1.0, -1.0);
            GL11.glVertex3d(1.0, -1.0, -1.0);

            //side face

            GL11.glColor3d(1.0, 0.0, 0.0);
            GL11.glVertex3d(1.0, 1.0, -1.0);
            GL11.glVertex3d(1.0, 1.0, -3.0);
            GL11.glVertex3d(1.0, -1.0, -3.0);
            GL11.glVertex3d(1.0, -1.0, -1.0);

            ...(I kept going like this for the rest of the faces)

             return;
         }

*************** EDIT ***************

我已经阅读了你的两个答案,并根据它编写了一个java lwjgl代码,但是当我尝试在Eclipse环境中运行它时,它给了我错误:

usage:
XPMFile <file>
java.lang.ArrayIndexOutOfBoundsException: 0
at org.lwjgl.util.XPMFile.main(XPMFile.java:260)

所以,这是我的代码:

    package testing;

    import org.lwjgl.LWJGLException;
    import org.lwjgl.opengl.Display;
    import org.lwjgl.opengl.DisplayMode;
    import org.lwjgl.opengl.GL11;
    import org.lwjgl.util.glu.GLU;

    public class CubeRender {
        public static void main(String[] args) {
            CubeRender cube = new CubeRender();
            cube.start();
        }

        public void start() {
            try {
                Display.setDisplayMode(new DisplayMode(800, 600));
                Display.create();
            } catch(LWJGLException e) {
                e.printStackTrace();
                System.exit(0);
            }

            initGL();

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

                Display.update();
            }

            Display.destroy();
        }

        public void initGL() {
            GL11.glMatrixMode(GL11.GL_PROJECTION);

            GL11.glLoadIdentity();

            GLU.gluPerspective(45, 100, 1, 100);
            GL11.glEnable(GL11.GL_DEPTH_TEST);
            GL11.glDepthFunc(GL11.GL_LEQUAL);

            GL11.glMatrixMode(GL11.GL_MODELVIEW);
        }

        public void renderCube() {
            double x = 1;
            double y = 1;
            double z = -1;

            //front face

            GL11.glBegin(GL11.GL_QUADS);

            GL11.glNormal3d(0, 0, 1);

            GL11.glColor3d(0.0, 1.0, 1.0);
            GL11.glVertex3d(x, y, z);
            GL11.glVertex3d(x-2, y, z);
            GL11.glVertex3d(x-2, y-2, z);
            GL11.glVertex3d(x, y-2, z);

            GL11.glEnd();

            //right face

            GL11.glBegin(GL11.GL_QUADS);

            GL11.glNormal3d(-1, 0, 0);

            GL11.glVertex3d(x, y, z);
            GL11.glVertex3d(x, y, z-2);
            GL11.glVertex3d(x, y-2, z-2);
            GL11.glVertex3d(x, y-2, z);

            GL11.glEnd();

            return;
        }
    }

******编辑2 ****** 如果您有任何可以为上述答案做出贡献,请在此处发布答案: How to import lwjgl_util

2 个答案:

答案 0 :(得分:1)

您使用二维正交视图请参阅以下行“GL11.glOrtho(0,800,600,0,1,-1);”它将所有内容剪辑为1,-1轴为第3维。

你真正需要注意的是设置一个3d视图,可能使用glFrustum或gluPerspective而不是glOrtho。

虽然现在已经老了,但你应该快速阅读http://nehe.gamedev.net/的Nehe教程,其中有一些LWJGL端口位于http://ninjacave.com/nehetutorials

的前几个端口。

请记住,Nehe教程使用的是经典的OpenGL,对于现代opengl来说几乎已经贬值了,但是知道经典opengl的工作方式并没有什么坏处。对于使用着色器和VBO等技术的一些较新的OpenGL教程,你会更好地谷歌,我建议你得到一些书,如OpenGL红皮书,橙皮书或OpenGL超级圣经。或者看看LWJGL Wiki上的links and resources page,它应该指向大量的opengl资源和教程。

答案 1 :(得分:0)

我不确定你是否包含它,但如果你不这样做,我会指出它。

您似乎试图绘制多维数据集,而不是真正开始绘制。

GL11.glBegin(int mode)

开始绘制形状。当绘制具有4个顶点的面时,使用GL11.GL_QUADS,每4个顶点将自动用作下一个面,然后再定义4个顶点。

GL11.GL_TRIANGLES用于创建三角形或具有3个顶点的面。对于您的情况,您想使用:

GL11.glBegin(GL11.GL_QUADS);

将其放置在渲染整个世界的开始处,您可以在任意点切换三角形和四边形,前一个面已完成。

完成所有绘制所有形状后,将此行放在渲染的最后。

GL11.glEnd();

这将结束绘图过程。

如果你计划使用光照,那么养成在放置顶点之前设置法线的习惯是非常重要的,法线是一组3个数字,用于指示面部指向哪个方向。默认情况下,它朝向+ z轴,这意味着如果你有一个地板和地板上方的灯光,那么光线似乎只会向一个方向移动。设置正常使用:

GL11.glNormal3d(x, y, z);

的示例:

 0,  1,  0 is straight up
 0, -1,  0 is straight down.
 1,  0,  0 is facing towards +X
-1,  0,  0 is facing towards -X
 0,  0,  1 is facing towards +Z
 0,  0, -1 is facing towards -Z

在顶点之前设置法线,不需要为每个顶点设置法线,只需在它们的组之前,看到该面上的所有顶点都将面向相同的方向。

即使没有光线,通常使用法线也是一个好主意,它们也会影响你的物理效果。

此外,如果没有深度测试,一些应该在其他3D对象后面的3D对象可能会显示在前面。 LWJGL具有专门用于深度的功能。

GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);

在设置矩阵模式等之前,将它放在initGL()中。

LEQUAL代表长度相等,它比较距离看哪个更高,那些距离更短的距离。

指向一些优秀的LWJGL资源: