我正在编写一个程序,只需要读取.obj文件并以线框模式呈现它。 我已经阅读了.obj文件(正确 - 我相信)我想渲染。但是我遇到了一些问题...假设是在线框中而是......(图像吼叫)
以下是代码:
public void render(GL gl){
float xMiddle = (m.getXVertexMax() + m.getXVertexMin())/2;
float yMiddle = (m.getYVertexMax() + m.getYVertexMin())/2;
float zMiddle = (m.getZVertexMax() + m.getZVertexMin())/2;
gl.glScalef(1/(m.getXVertexMax() - m.getXVertexMin()), 1, 1);
gl.glScalef(1, 1/(m.getYVertexMax() - m.getYVertexMin()), 1);
gl.glScalef(1, 1, 1/(m.getZVertexMax() - m.getZVertexMin()));
gl.glBegin(GL.GL_TRIANGLES);
{
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINES);
for(int i = 0; i < m.faces.size(); i++ ){
Vector3f n1 = m.normals.get(m.faces.get(i).getNormalIndices()[0] - 1);
Vector3f v1 = m.vertices.get(m.faces.get(i).getVertexIndices()[0] - 1);
gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);
gl.glNormal3f(n1.x, n1.y, n1.z);
Vector3f n2 = m.normals.get(m.faces.get(i).getNormalIndices()[1] - 1);
Vector3f v2 = m.vertices.get(m.faces.get(i).getVertexIndices()[1] - 1);
gl.glVertex3f(v2.x - xMiddle, v2.y - yMiddle, v2.z - zMiddle);
gl.glNormal3f(n2.x, n2.y, n2.z);
Vector3f n3 = m.normals.get(m.faces.get(i).getNormalIndices()[2] - 1);
Vector3f v3 = m.vertices.get(m.faces.get(i).getVertexIndices()[2] - 1);
gl.glVertex3f(v3.x - xMiddle, v3.y - yMiddle, v3.z - zMiddle);
gl.glNormal3f(n3.x, n3.y, n3.z);
}
}
gl.glEnd();
}
注意:代码中的Vector3f是我创建的数据结构。
我已经尝试了我能找到的所有东西,但仍然,它不会将图像渲染为线框! : - /
任何人都可以伸出援手吗?
答案 0 :(得分:1)
gl.glBegin(GL.GL_TRIANGLES);
{
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINES);
...
非常少数GL命令在glBegin()/glEnd()
块内有效:
glBegin和glEnd之间只能使用GL命令的子集。 命令是 glVertex,glColor,glSecondaryColor,glIndex,glNormal,glFogCoord,glTexCoord,glMultiTexCoord,glVertexAttrib,glEvalCoord,glEvalPoint, glArrayElement,glMaterial和glEdgeFlag。此外,它是可以接受的 使用glCallList或glCallLists来执行包含的显示列表 只有前面的命令。 如果在glBegin和glEnd之间执行任何其他GL命令,则会设置错误标志并忽略该命令。
glEnable()
和glPolygonMode()
不在该列表中。
将它们移到glBegin()
区块之外。
gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);
gl.glNormal3f(n1.x, n1.y, n1.z);
错误的方式。你想要正常,然后顶点:
gl.glNormal3f(n1.x, n1.y, n1.z);
gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);
glNormal()
仅设置当前法线,glVertex()
是实际发送到管道的内容。