【问题标题】:Java/OpenGL missing triangles when loading and rendering vertexes from obj model从 obj 模型加载和渲染顶点时,Java/OpenGL 缺少三角形
【发布时间】:2023-03-22 21:20:01
【问题描述】:

我正在尝试从 OBJ 文件加载顶点并渲染它们。但只有一些三角形在渲染。

模型的外观: Blender model

如何呈现: Rendered model

我的代码:

  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();

(我知道这远非最有效的方法)

我使用 JOGL 库进行渲染,使用 java-data-front 加载 obj 文件并对其进行解析。模型已正确加载,但未渲染。

【问题讨论】:

  • 显示 System.out.println(model.getVertices().get(i).x + " " + model.getVertices().get(i).y + " " + model.getVertices().get(i).z);
  • pastebin.com/8Au4HYZM 它打印出顶点以检查加载是否没有问题,并且我检查它与文件相同,因此正确加载
  • @Maratonec A Wavefront (OBJ) 由顶点和面索引组成。您需要遍历索引并按照索引的顺序渲染顶点。
  • @Rabbid76 谢谢!可以给我一些小代码sn-p吗?
  • 没关系,我想通了。但真的感谢面部指数。我不知道它们的存在。我会自己回答

标签: java opengl jogl vertex


【解决方案1】:

(自答)

我会为每个对象、网格和面设置太多循环。然后像@Rabbid76 所说的那样获取引用和索引。

代码:

        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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2017-02-04
    相关资源
    最近更新 更多