Obj - Ein loader/writer für Wavefront OBJ-Dateien

Mal was anderes, aber nichts neues: Der tausendste Loader für OBJ-Dateien.

Die Library liegt unter https://github.com/javagl/Obj und ist demnächst auch unter


<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>obj</artifactId>
  <version>0.2.0</version>
</dependency>

verfügbar.

Einige mag vielleicht die ungewöhnlich hohe Versionsnummer irritieren: 0.2.0!!! :open_mouth: Das liegt daran, dass eine frühere Version schonmal unter javagl.de - Utilities lag (die wurde jetzt aber gekickt).

Eines der Ziele dieser Library war es, es möglichst leicht zu machen, eine OBJ-Datei zu laden, und so aufzubereiten, dass die darin enthaltenen Daten mit OpenGL gerendert werden können. Das schließt einige Schritte mit ein:

  • Die Eingabedaten müssen trianguliert werden
  • Man muss dafür sorgen, dass Textur- und Normalen-Indizies in bezug auf die Vertices eindeutig sind
  • Das ganze muss „single indexed“ werden - so dass man auf die Texturkoordinaten und Normalen mit den gleichen Indizes zugreifen kann, wie auf die Vertices
  • Man muss sich die ganzen Daten als (direct!) Buffers abholen können

Die ersten drei Punkte sind in einer convertToRenderable-Methode zusammengefasst, und für die Buffers gibt es auch Utilities. D.h. mit wenigen Zeilen Code…

FileInputStream inputStream = new FileInputStream("buddha.obj");

Obj obj = ObjUtils.convertToRenderable(
    ObjReader.read(inputStream));

IntBuffer indices = ObjData.getFaceVertexIndices(obj);
FloatBuffer vertices = ObjData.getVertices(obj);
FloatBuffer normals = ObjData.getNormals(obj);

… bekommt man die Buffer, die man zum Rendern braucht:

Nachdem Google diese Library in ihrer Android-AR-Demo unter https://github.com/google-ar/arcore-android-sdk verwendet hat, hat die einige Aufmerksamkeit gewonnen. Inzwischen gibt es sage und schreibe Version 0.3.0 (was wohl eine der höchsten Versionsnummern ist, die ich je benutzt habe). Sie liegt unter

<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>obj</artifactId>
  <version>0.3.0</version>
</dependency>

und in den Issues werden gerade noch einige mögliche Erweiterungen diskutiert. Ich bin da aber zurückhaltend: Das Ziel war (und soll bleiben) eine kleine, Abhängigkeitsfreie Utility-Lib zu haben, deren Funktionsumfang sich auf das beschränkt, wofür sie im Kern gedacht ist: OBJ-Daten laden, so, dass man sie rendern kann.