【问题标题】:Advice needed for 3D objects using the Lightweight Java Game Library (LWJGL)使用轻量级 Java 游戏库 (LWJGL) 的 3D 对象所需的建议
【发布时间】:2011-10-31 19:55:53
【问题描述】:

我花了大约 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;
         }

***************编辑***************

我已经阅读了你的两个答案,并基于它制作了一个 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

【问题讨论】:

    标签: java lwjgl


    【解决方案1】:

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

    您真正需要查看的是设置 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 资源和教程。

    【讨论】:

    • 感谢回复,我试试看。
    • 好的,我查看了lwjgl网站上的gluPerspective,我知道它需要四个浮点值,但是你怎么用呢?浮点值是什么意思???
    • 不要认为我能比这个链接更好地解释它profs.sci.univr.it/~colombar/html_openGL_tutorial/en/…nearClip 点之前和farClip 点之后的任何东西都被剪裁(即未绘制),纵横比通常是比率屏幕的角度(即宽度/高度),fov 是视野的角度。
    • 感谢您的回答,我查看了该网站,它帮助很大。我认为你会导入 org.lwjgl.util.gluPerspective
    • gluPerspective 是 GLU 库的一部分,LWJGL 在 lwjgl_util.jar 中包含 GLU,因此导入将为“import org.lwjgl.util.glu.GLU;”然后在您的代码中使用“GLU.gluPerspective()”(带参数)lwjgl.org/javadoc/org/lwjgl/util/glu/GLU.html
    【解决方案2】:

    我不确定你是否包含它,但如果你没有,我会指出来。

    您似乎正在尝试绘制立方体,但实际上并未开始绘制。

    GL11.glBegin(int mode)
    

    开始绘制形状。 GL11.GL_QUADS 用于绘制有4个顶点的面,每增加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 对象可能会出现在前面。 LWJGL 有一个专门用于使用深度的功能。

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

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

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

    一些好的 LWJGL 资源的指针:

    【讨论】:

    • 感谢您的额外帮助,我确实将 GL11.glBegin 放入了我的代码中,但没有发布,如果您要绘制具有四个以上顶点的面,您会怎么做?而且我不知道法线或深度的东西,你提供的链接非常有帮助。
    • 大多数引擎不允许具有超过 4 个顶点的多边形,因此它们中的大多数将一个面分成几个,例如,将一个 5 面的面由两个面组成一个正方形和一个三角形正方形的顶点。对于 LWJGL,可以使用 GL_POLYGON,但效果不佳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多