2013-11-26 2 views
1

Я пишу программу, которая просто должна прочитать файл .obj и отобразить его в режиме проводной рамки. Я уже прочитал файл .obj (правильно - я считаю), который я хочу отобразить. Но я имею некоторые проблемы ... Это, предполагают, чтобы быть в проволочном каркасе, но вместо того, чтобы ... (изображение ниже)OpenGL wireFrame render 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 для выполнения списков отображения, которые включают в себя только предыдущие команды. Если какая-либо другая команда GL выполняется между glBegin и glEnd, устанавливается флаг ошибки, и команда игнорируется.

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

Также он использует 'glEnable' и' glPolygonMode' в 'glBegin' и' glEnd', что, вероятно, также является частью проблемы, которая не отображается в каркасе. – Vallentin

+0

Спасибо большое! это сработало!: - D – Snox