2013-11-26 109 views
1

我正在編寫一個程序,只需要讀取.obj文件並以線框模式呈現它。 我已經閱讀.obj文件(正確 - 我相信),我想呈現。但我有一些問題......這是假設在線框而是...(圖像波紋管)OpenGL線框OBJ文件的渲染

my output

下面是代碼:

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在代碼中,是我做的一個數據結構。

我已經嘗試了所有我能找到但仍然不會渲染圖像的線框! : -/

任何人都可以舉手嗎?

回答

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()塊內纔有效:

只有GL命令的子集可以在glBegin和glEnd之間使用。 的命令是 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()實際上是用於發送下來的管道。

+0

此外,他在'glBegin'和'glEnd'中使用'glEnable'和'glPolygonMode',這可能也是問題的一部分,不會以線框呈現。 – Vallentin

+0

非常感謝!它的工作!: - D – Snox