# Wavefront OBJ

OBJ (oder .obj) ist ein offenes Dateiformat zum Speichern von dreidimensionalen geometrischen Formen. Das von Wavefront Technologies entwickelte Format wird von vielen 3D-Grafikprogrammen unterstützt und ist daher geeignet für die programm- und plattformübergreifende Weitergabe von 3D-Modellen.
Das OBJ-Format speichert geometrische Eigenschaften eines Objekts oder gruppierter Objekte, d. h. Ecken, Textur-Koordinaten, Normalen, Flächen und Glättungen. Optische Materialeigenschaften (z. B. Spiegelung, Transparenz, Glanzlicht usw.) werden in einer separaten Materialdatei definiert, die auch Angaben zu Texturierungen enthalten kann. Die Materialdatei besitzt in der Regel die Dateiendung .mtl (von engl. material template library) und kann in der eigentlichen OBJ-Datei referenziert werden.

## Aufbau

* optionaler Kommentar
* ggf. Einbindung des material template library.
* ggf. Objektbenennung
* Liste der Eckpunkte (Vertices)
* Liste der Textur-Koordinaten
* Liste der Normalen
* Beschreibung der Flächen (Mit Gruppierung)
** ggf. Gruppenname für folgende Flächen
** ggf. Name des zu verwendenden Materials
** ggf. Nummer der Glättungsgruppe
** Beschreibung der Flächen

## Details

Obj-Dateien werden zeilenweise ausgelesen, jeder Befehl benötigt eine neue Zeile.
Ein gültiger Eckpunkt-Index stimmt mit dem entsprechenden Eckpunktelementen der zuvor definierten Vertexliste überein. Ist der Index positiv, dann bezieht er sich auf die Stelle in der Eckpunktliste, welche mit 1 beginnt. Ist ein Index negativ, dann bezieht er sich auf das Ende der Eckpunktliste. Wobei -1 sich auf den an der aktuellen Dateiposition zuletzt definiert Punkt bezieht.
Oben genannte Befehle:
"# <string Kommentar>" Kennzeichnung eines Kommentars – Alles in derselben Zeile nach der Raute wird ignoriert.
"mtllib <string Path>" Einbindung einer Materialbibliothek – in der Datei beschriebene Materialien sind nun verwendbar.
"o <string Name>" Benennung des Objekts.
"v <float X> <float Y> <float Z> [ <float W> ]" Beschreibung eines Eckpunktes (engl. vertex).
"vt <float X> <float Y>" Beschreibung eines Texturkoordinatenpunktes.
"vn <float X> <float Y> <float Z>" Beschreibung einer Normalen.
"g <string Name>" Benennung einer Gruppierung (alle folgenden Flächen werden dieser Gruppierung zugeordnet).
"usemtl <string Material_Name>" Alle folgenden Flächen erhalten das in der Materialbibliothek mit diesem Namen identifizierte Material.
"s <integer Glättungsgruppe>" Alle folgenden Flächen erhalten eine definierte zwischen 1 und 32 liegende Glättungsgruppennummer. Die Kanten nebeneinander liegender Flächen mit derselben Glättungsgruppennummer werden glatt dargestellt (Die Kante zwischen beiden Flächen wird unsichtbar), nebeneinander liegende Flächen mit unterschiedlicher Glättungsgruppennummer werden normal dargestellt (Die Kante zwischen beiden Flächen wird sichtbar).
"s off" Abschaltung der Glättung.
"f <integer A_V> <integer B_V> <integer C_V>..." Beschreibung einer Fläche. (Möglichkeit 1 – anhand von Eckpunkten)
"f <integer A_V> / <integer A_VT> <integer B_V> / ..." Beschreibung einer Fläche. (Möglichkeit 2 – anhand von Eckpunkten und Texturkoordinaten)
"f <integer A_V> // <integer A_VN> <integer B_V> // ..." Beschreibung einer Fläche. (Möglichkeit 3 – anhand von Eckpunkten und Normalen)
"f <integer A_V> / <integer A_VT> / <integer A_VN> <integer B_V> / ..." Beschreibung einer Fläche. (Möglichkeit 4 – anhand von Eckpunkten, Texturkoordinaten und Normalen)
Zudem können auch noch Grad, Basis Matrix, "Schritt Größe" und anstatt Flächen Linien, Punkte und Kurven beschrieben werden.

## Verwandte Dateiformate

* PLY – Polygon File Format
* STL – Standard Triangulation/Tesselation Language
* OFF – Object File Format
* Collada (.dae)