我花了大约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
答案 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资源: