我正在编写一个只需要读取.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是我制作的数据结构。

我已经尝试了所有可能找到的东西,但是仍然无法将图像渲染为线框! :-/

有人可以帮忙吗?

最佳答案

gl.glBegin(GL.GL_TRIANGLES);
{
    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINES);
    ...


glBegin()/glEnd()块中很少有GL命令有效:


  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()是实际将其发送到管道的内容。

10-08 01:28