javaopengljoglvertex

Java/OpenGL missing triangles when loading and rendering vertexes from obj model


I am trying to load vertexes from OBJ file and render them. But only some triangles are rendering.

How the model should look: Blender model

How its rendered: Rendered model

My code:

  GL2 gl = glad.getGL().getGL2();
  gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
   
  gl.glRotatef(0.5f, 1f, 1f, 1f);
   
  gl.glColor3f(1, 0, 0);
  gl.glBegin(GL2.GL_TRIANGLE_STRIP); // Start Drawing The Cube
  try (InputStream in = new FileInputStream("D:\\untitled.obj")) {
    
    final IOBJParser parser = new OBJParser();
    final OBJModel model = parser.parse(in);

    
    for(int i = 0; i < model.getVertices().size(); i++) {
        
        
        System.out.println(model.getVertices().get(i).x + " " + model.getVertices().get(i).y + " " + model.getVertices().get(i).z);
        
        gl.glNormal3f(model.getNormals().get(i).x,model.getNormals().get(i).y, model.getNormals().get(i).z);
        gl.glVertex3f(model.getVertices().get(i).x,model.getVertices().get(i).y, model.getVertices().get(i).z);
        
        
        
        
    }
    
    } catch (FileNotFoundException ex) {
        Logger.getLogger(EventListener.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(EventListener.class.getName()).log(Level.SEVERE, null, ex);
    
}
  
  gl.glEnd();
  gl.glFlush();

(I know this is far from the most efficient method)

I am using JOGL library for the rendering and java-data-front for loading the obj file and parsing it. The model is loaded correctly, but not rendered.


Solution

  • (Self answering)

    I'd have too loop for every object, mesh, and face. And then get the references and indexes as @Rabbid76 said.

    The code:

            GL2 gl = glad.getGL().getGL2();
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
       
      gl.glRotatef(0.5f, 1f, 1f, 1f);
       
      gl.glColor3f(1, 0, 0);
      gl.glBegin(GL2.GL_TRIANGLE_STRIP); // Start Drawing The Cube
      try (InputStream in = new FileInputStream("D:\\untitled.obj")) {
        
        final IOBJParser parser = new OBJParser();
        final OBJModel model = parser.parse(in);
    
         for (OBJObject object : model.getObjects()) {
        for (OBJMesh mesh : object.getMeshes()) {
        for (OBJFace face : mesh.getFaces()) {
            for (OBJDataReference reference : face.getReferences()) {
        final OBJVertex vertex = model.getVertex(reference);
        gl.glVertex3f(vertex.x, vertex.y, vertex.z);
         if (reference.hasNormalIndex()) {
        final OBJNormal normal = model.getNormal(reference);
        gl.glNormal3f(normal.x, normal.y, normal.z);
    }
    if (reference.hasTexCoordIndex()) {
        final OBJTexCoord texCoord = model.getTexCoord(reference);
        gl.glTexCoord3f(texCoord.u, texCoord.v, texCoord.w);
    }
    }
        }
        }
        }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(EventListener.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(EventListener.class.getName()).log(Level.SEVERE, null, ex);
        
    }
      
      gl.glEnd();
      gl.glFlush();