我正在使用JOGL在Java中构建一个简单的 Wavefront Obj文件加载器和渲染器。但是,每当我加载一个简单的兔子测试网格时,它都会以一种微不足道的方式呈现,我不知道是什么原因导致它。我只是使用几何顶点和法线,没有纹理或材料。
以下是init()
方法的GL初始化代码:
gl.setSwapInterval(1);
gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
gl.glEnable(GL2.GL_DEPTH_TEST);
gl.glDepthFunc(GL2.GL_LESS);
gl.glEnable(GL2.GL_CULL_FACE);
gl.glCullFace(GL2.GL_BACK);
gl.glShadeModel(GL2.GL_SMOOTH);
gl.glClearDepth(1.0d);
这是我用来渲染模型的方法(现在是固定管道):
gl.glBegin(GL2.GL_TRIANGLES);
for(Face face : master.faces) {
for(int i = 0; i < face.points.length; i++) {
gl.glNormal3f(face.normals[i].x, face.normals[i].y, face.normals[i].z);
gl.glVertex3f(face.points[i].x, face.points[i].y, face.points[i].z);
}
}
gl.glEnd();
其中master
是包含 all 面和顶点的主“组”。我已经检查过 - 所有内容都进入主组,并且每个三角形中的每个所需顶点都会调用glNormal3f和glVertex3f。
有人能说出导致这些故障的原因吗?
以下是我用来设置投影和模型视图矩阵的代码:
float aspect = (float) width / (float) height;
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(60.0f, aspect, 0.01f, 100.0f);
glu.gluLookAt(2.0f, 1.0f, 1.5f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
答案 0 :(得分:1)
尝试删除 gl.glDepthFunc(GL2.GL_LESS); gl.glClearDepth(1.0D);
答案 1 :(得分:0)
好吧,这似乎是由我的对象加载器中的一个愚蠢的小虫引起的。
解析输入顶点时,它会选择几何顶点的所有x坐标的第一个字符。这并没有影响正值,因为它们都被归一化并0.43 = .43
,但它搞砸了所有负值,导致它们被解释为正值。
我花了一段时间来弄明白这一点,但我最终找到了它,它只是表明最微小的错误可能非常难以追踪。