OBJ in GLB umwandeln

OBJ kannst du hier kostenlos und ohne Konto in GLB umwandeln: Datei oben ablegen, und ein, zwei Sekunden später steht das Ergebnis zum Herunterladen bereit. Die Umwandlung läuft in deinem eigenen Browser, die Datei wird also nie hochgeladen — das klappt unter Windows, macOS und Linux ebenso wie auf iPhone und Android, und es funktioniert selbst dann noch, wenn du das Netz abschaltest.

  • Wo es läuft In deinem Browser. Die Datei wird nicht hochgeladen.
  • Neu aufgebaut GLB funktioniert anders als OBJ. Es ist also nicht der schleichende Qualitätsverlust eines verlustbehafteten Codecs: Was GLB ausdrücken kann, wird originalgetreu wiedergegeben — was dort keine Entsprechung hat, bleibt ganz weg.
  • Größenbegrenzung Bis 100 MB pro Datei, kostenlos und ohne Konto.
  • Gut zu wissen Nur die Geometrie. Materialien, Farben, Texturen und Animation kommen nicht mit, und ein mehrfach platziertes Modell kommt so zurück, dass jede Kopie fest an ihrer eigenen Position sitzt.

Bis zu 100 Dateien auf einmal. Gemischte Formate sind kein Problem.

Warum ein 3D-Modell für das Web erst eine GLB braucht

Kein Browser liest OBJ, und auch GLB nicht wirklich nativ — eine .glb-Datei direkt angesteuert wird heruntergeladen statt dargestellt. Der Unterschied liegt bei den Bibliotheken: three.js, Babylon.js und das model-viewer-Webkomponente nehmen GLB als bevorzugtes Eingabeformat und laden es in einem einzigen Zugriff, während OBJ ein Nebenlader ist, der zusätzlich die MTL-Datei und jede Textur einzeln nachladen muss.

Deutsche Museen, die Ausstellungsstücke als 3D-Scans online zeigen, und Industriekataloge deutscher Maschinenbauer, die ein Bauteil interaktiv auf der Produktseite drehbar machen wollen, stehen vor derselben praktischen Frage: nicht, welches Format der Browser irgendwie versteht, sondern welches die eingesetzte Laufzeitumgebung erwartet. Für alles, was nach 2018 veröffentlicht wurde, lautet die Antwort GLB, und auf einer Produktseite, bei der das Modell der eigentliche Inhalt ist, ist das Zusammenfassen mehrerer Anfragen in eine auf dem Handy ein spürbarer Unterschied.

Die MTL-Datei, auf die deine OBJ zeigt, wird nie geöffnet

Eine OBJ-Datei enthält selbst keine Materialien. Sie enthält eine mtllib-Zeile, die auf eine daneben liegende .mtl-Datei verweist, und usemtl-Zeilen, die zwischen deren Einträgen wechseln — und diese .mtl-Datei trägt die diffuse Farbe, die Glanzwerte und die Pfade zu den Texturbildern. Diese Umwandlung liest nur v-, o-, g- und f-Zeilen und ignoriert den Rest.

Die Folge ist eindeutig und lässt sich vorher einplanen: Die GLB-Datei enthält Geometrie und Gruppennamen, der Betrachter zeichnet sie mit seinem eigenen Standardmaterial. Soll das Modell mit Textur gezeigt werden, führt der Weg über Blender — OBJ mit MTL importieren, dann als glTF Binary exportieren, wobei die Bilder direkt in die GLB-Datei eingepackt werden. Diese Seite ist für den Fall gedacht, dass die Form die eigentliche Lieferung ist.

Was tatsächlich in der erzeugten GLB-Datei steht

Ein glTF-2.0-Binary: zwölf Byte Header, ein JSON-Block, auf eine Vier-Byte-Grenze mit Leerzeichen aufgefüllt, danach ein binärer Block mit Nullen aufgefüllt. Im JSON: ein Mesh pro OBJ-Gruppe, ein Node pro Mesh, eine Szene, die alle auflistet, eine Asset-Version 2.0, und je Mesh ein float32-VEC3-Positions-Accessor sowie ein uint32-SCALAR-Index-Accessor.

Jeder Positions-Accessor trägt Minimum und Maximum. Das ist eine Vorgabe der Spezifikation und praktisch der Unterschied zwischen einem Modell, das beim Laden erscheint, und einem, das leer bleibt — model-viewer und three.js leiten daraus die anfängliche Kameraentfernung ab, und Dateien ohne diese Werte sind ein häufiger Grund für eine scheinbar leere Szene.

Jede OBJ-Gruppe wird zu einem eigenen Mesh — und kostet einen Zeichenaufruf

Der Reader beginnt bei jeder o- oder g-Zeile eine neue Gruppe, und der Writer erzeugt ein glTF-Mesh je Gruppe, jedes in einem eigenen Node mit eigenem Primitiv. Eine aus einem CAD-Programm exportierte OBJ-Datei mit einer Gruppe je Flächenpatch kann Hunderte solcher Gruppen enthalten, und die GLB-Datei bildet sie alle getreu als eigene Meshes ab.

Auf einer Seite ist das ein echter Kostenpunkt. Jedes Primitiv ist ein eigener Zeichenaufruf und eine eigene GPU-Pufferbindung, und ein paar hundert davon auf einem Mittelklasse-Handy sind genau dort, wo die Bildrate einbricht. Objekte vor dem Export in Blender zusammenzuführen, oder die g-Zeilen mit einem Texteditor zu entfernen, wenn die Gruppierung ohnehin keine Bedeutung trägt, ist eine Zwei-Minuten-Korrektur, die sich mehr auszahlt als das meiste, was danach kommt.

Flache Schattierung, und warum das Modell wie ein Low-Poly-Objekt aussieht

Es wird kein NORMAL-Attribut geschrieben. Die glTF-Spezifikation sagt für diesen Fall genau, was ein Betrachter zu tun hat: flache Flächennormalen berechnen. Eine in der Modellierungssoftware glatt aussehende Kugel erscheint im Browser deshalb mit jedem einzelnen Dreieck als sichtbarer Facette — was wie ein bewusster Low-Poly-Stil wirkt und meistens keiner ist.

Zwei saubere Lösungen gibt es dafür. In three.js computeVertexNormals auf der geladenen Geometrie aufrufen, was die Flächennormalen je Eckpunkt mittelt und ein sauber verschweißtes Mesh braucht — was hier der Fall ist, weil Positionen beim Umwandeln auf sechs Nachkommastellen zusammengeführt werden. Oder den Normalen-Durchgang schon in Blender machen und von dort als glTF exportieren, was gleich auch die Materialien mitbringt.

Achse und Maßstab: zwei Dinge, die eine OBJ-Datei nie festlegt

glTF legt beides fest. Es ist rechtshändig, Y-Achse nach oben, und die lineare Einheit ist der Meter. Eine OBJ-Datei legt keines von beidem fest — sie ist eine Zahlenliste ohne Header, ohne Einheit und ohne Achsenkonvention, und jedes Programm, das eine schreibt, hat dabei seine eigene Gewohnheit.

Diese Umwandlung nimmt keine Anpassung vor, also entsteht aus einer Z-oben-OBJ-Datei eine GLB-Datei, deren Modell auf dem Rücken liegt, und aus einer in Zentimetern gedachten OBJ-Datei eine zweihundert Meter hohe. Beides lässt sich mühelos beheben, sobald man weiß, welcher Fall vorliegt — eine Drehung um minus 90 Grad um die X-Achse, und eine einheitliche Skalierung —, und beides fällt erst beim Laden der Datei auf. Der Begrenzungsrahmen gegen eine bekannte Abmessung geprüft ist die schnellste Diagnose.

Was der OBJ-Reader vor dem Schreiben der GLB-Datei tut

Flächen mit mehr als drei Ecken werden vom ersten Eckpunkt aus fächerförmig trianguliert, was für die üblichen konvexen Vierecke und n-Ecke korrekt ist und bei einer konkaven Fläche überlappende Dreiecke erzeugen kann. Negative Face-Indizes, die vom zuletzt gelesenen Eckpunkt rückwärts zählen, werden schon beim Einlesen aufgelöst, weil ihre Bedeutung von der Position in der Datei abhängt.

Die Positionen werden anschließend verschweißt: auf sechs Nachkommastellen abgeglichen, sodass eine in zwanzig Dreiecken auftauchende Koordinate nur einmal gespeichert und zwanzigmal referenziert wird. Das verkleinert den Puffer und gibt dem Browser gleichzeitig ein Mesh mit echter Nachbarschaft, was erst computeVertexNormals eine glatte statt der flachen Schattierung liefern lässt.

Die Größe der GLB, und wie man sie kleiner bekommt

Zwölf Byte je Eckpunkt für die Positionen und zwölf Byte je Dreieck für die Indizes, dazu ein kleiner JSON-Header. Ein Modell mit 200.000 Dreiecken und 100.000 Eckpunkten liegt damit bei rund 3,6 MB, unkomprimiert. Die Indizes sind ausnahmslos uint32, was unterhalb von 65.535 Eckpunkten zwei Byte mehr kostet als nötig, aber eine Bedingung erspart, die sich sonst an einer Schwelle unbemerkt anders verhalten würde.

Ist diese Größe für die Seite zu viel, liegt die Antwort vor und nach dieser Umwandlung, nicht in ihr: das Mesh in Blender oder MeshLab vorher reduzieren, und anschließend gltf-transform für Draco- oder Meshopt-Kompression einsetzen — wobei zu bedenken bleibt, dass der Browser dafür einen passenden Decoder mitladen muss, was auf einer Seite mit nur einem Modell wiederum eine eigene Kosten hat.

Wann eine OBJ-Datei fürs Web noch nicht bereit ist

Braucht das Modell seine Texturen, führt der Weg über Blender, damit MTL-Datei und Bilder mitkommen. Hat das Modell eine halbe Million Dreiecke, wird vorher reduziert statt es einfach hochzuladen und zu hoffen. Muss es glatt wirken, wird das Normalen-Problem im Betrachter oder im Exportprogramm gelöst, denn diese Seite liefert dafür keine Abhilfe.

Wofür diese Seite gut ist, ist der ehrliche Mittelfall: eine saubere OBJ-Datei eines Bauteils, eines Requisits oder eines Scans, der auf einer Seite als Form erscheinen soll, in einer Datei, ohne das Modell irgendwohin hochzuladen. Diese Umwandlung läuft vollständig im Browser, ohne Engine zum Herunterladen und mit einer Obergrenze von 100 MB, und liefert eine Datei, die jeder aktuelle Web-Betrachter annimmt.

Nichts verlässt das eigene Gerät

Das Verschweißen, Indizieren und Verpacken zur GLB-Datei geschieht vollständig im Browser-Tab. Gerade bei Werkstückgeometrie mit gewerblichem Wert — ein noch unveröffentlichtes Bauteil, ein Prototyp, ein Kundenauftrag — ist das keine Nebensache: Es gibt keinen Moment, an dem die Geometrie einen fremden Server erreicht.

Der Netzwerktab der Entwicklertools bestätigt das während der Umwandlung, und die Datei bleibt bis 100 MB ohne Konto und ohne Warteschlange nutzbar — was für ein einzelnes 3D-Modell in aller Regel mehr als genug ist.

OBJ in GLB umwandeln — so geht es

  1. Leg deine OBJ-Datei auf dieser Seite ab, oder klick, um eine auszuwählen.
  2. Wähl GLB als Ziel. Die Umwandlung läuft in deinem Browser, die Datei wird nicht hochgeladen.
  3. Lade die fertige GLB-Datei herunter.

OBJ und GLB im Vergleich: was sich ändert

OBJ im Vergleich zu GLB
OBJGLB
Vollständiger NameWavefront-ObjektBinary glTF
Dateiendung.obj.glb
Medientypmodel/objmodel/gltf-binary
Erstmals veröffentlicht19922016
Herausgegeben vonWavefront TechnologiesKhronos Group
SpezifikationglTF 2.0
LizenzlageOffener StandardOffener Standard
Heutiger StandAktuellAktuell
Öffnet im BrowserKein BrowserKein Browser
Stattdessen erwogenGLTF, PLY, STLGLTF

Das Ergebnis öffnen

Blender liest sowohl OBJ als auch GLB — du kannst das Ergebnis also gegen das Original prüfen, ohne ein zweites Programm zu brauchen.

Wofür die beiden Formate gedacht sind

Die beiden zielen auf verschiedene Arbeit: OBJ auf den Austausch zwischen Programmen und die Bearbeitung, GLB auf das Web und die Weitergabe fertiger Dateien. Das lohnt sich vorher abzuwägen — der Grund, aus dem es das eine gibt, ist meist der Grund, aus dem das andere unpraktisch ist.

GLB kommt von Khronos Group und stammt aus 2016, festgehalten in glTF 2.0. Blender, three.js und Babylon.js lesen das Format.

OBJ wurde 1992 veröffentlicht, GLB 2016. Das ältere ist in der Regel die sicherere Datei zum Weitergeben, das jüngere erledigt dieselbe Aufgabe mit weniger Bytes.

OBJ zu GLB: häufige Fragen

Werden meine OBJ-Dateien irgendwo hochgeladen?

Nein. Diese Umwandlung läuft vollständig in deinem Browser, die Datei verlässt dein Gerät also nicht. Du kannst das selbst nachprüfen: Öffne den Netzwerk-Tab der Entwicklerwerkzeuge und wandle etwas um. Zu sehen sind die Seite selbst und die Statistik- und Werbeanfragen, mit denen dieser Dienst bezahlt wird — und keine einzige, die deine Datei trägt.

Ist das Umwandeln von OBJ in GLB kostenlos?

Ja. Kein Konto, kein Wasserzeichen und kein Tageskontingent, das sich verbraucht — es läuft auf deinem eigenen Rechner, du darfst also so oft wiederkommen, wie du willst. Dateien bis 100 MB verarbeitet der Browser, 100 auf einmal.

Geht beim Umwandeln von OBJ in GLB Qualität verloren?

OBJ und GLB beschreiben Inhalte auf grundverschiedene Weise. Die Umwandlung ist deshalb ein Nachbau und keine Kopie: originalgetreu, aber nicht Byte für Byte dasselbe. Nur die Geometrie. Materialien, Farben, Texturen und Animation kommen nicht mit, und ein mehrfach platziertes Modell kommt so zurück, dass jede Kopie fest an ihrer eigenen Position sitzt.

Muss ich etwas installieren, um GLB-Dateien zu öffnen?

Für die Umwandlung selbst nicht — sie läuft in dem Browser, den du ohnehin offen hast. Zum Öffnen brauchst du danach das Programm, das auf deinem Gerät üblicherweise Binary glTF anzeigt.

Mehr über diese Formate