【问题标题】:OpenGL wireFrame render of a OBJ fileOBJ 文件的 OpenGL 线框渲染
【发布时间】:2013-12-11 20:35:29
【问题描述】:

我正在编写一个程序,它只需要读取一个 .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,是我自己做的一个数据结构。

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

有人可以帮忙吗?

【问题讨论】:

    标签: java opengl rendering wireframe wavefront


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

    【讨论】:

    • 另外,他在glBeginglEnd 中使用了glEnableglPolygonMode,这可能也是线框未渲染问题的一部分。
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2012-09-13
    • 2015-05-20
    • 2012-10-30
    • 2020-05-12
    • 2011-12-12
    • 2017-02-10
    • 2014-06-11
    相关资源
    最近更新 更多