OBJ naar GLB omzetten

Hier zet je OBJ naar GLB om, gratis en zonder account: sleep het bestand hierboven erin en binnen een paar seconden staat het resultaat klaar om te downloaden. De omzetting gebeurt binnen je eigen browser, dus het bestand wordt nooit geüpload. Het werkt hetzelfde op Windows, macOS en Linux als op iPhone en Android, en het blijft werken als je de verbinding verbreekt.

  • Waar het draait In je browser. Het bestand wordt nooit geüpload.
  • Opnieuw opgebouwd GLB werkt anders dan OBJ. Het is dus niet het geleidelijke kwaliteitsverlies van een lossy codec: wat GLB kan uitdrukken wordt getrouw weergegeven, en wat daar geen equivalent heeft blijft helemaal weg.
  • Maximale grootte Tot 100 MB per bestand, gratis en zonder account.
  • Goed om te weten Alleen de meetkunde. Materialen, kleuren, texturen en animatie gaan niet mee, en een model dat meerdere keren geplaatst is komt terug met elke kopie vastgezet op zijn eigen plek.

Tot 100 bestanden tegelijk. Verschillende formaten door elkaar is prima.

Waarom een OBJ een GLB moet worden voor hij op een pagina komt

Geen browser leest OBJ, en geen enkele leest GLB van huis uit — een .glb waar je rechtstreeks naartoe navigeert wordt gedownload in plaats van getoond. Wat verschilt is het bibliotheekecosysteem. three.js, Babylon.js en het model-viewer-webcomponent nemen allemaal een GLB als hun primaire invoer en laden die in één keer, terwijl OBJ-ondersteuning een zijladen is dat ook de MTL en elke textuur als aparte verzoeken nodig heeft.

De praktische vraag is dus niet welk formaat de browser begrijpt, maar welk formaat de runtime die je gaat opnemen verwacht. Voor alles gepubliceerd na 2018 is dat antwoord GLB, en voor een productpagina waar het model de inhoud is, is vier of vijf verzoeken tot één inkorten een meetbaar verschil op een telefoon.

De MTL waar je OBJ naar wijst wordt nooit geopend

Een OBJ-bestand bevat zelf geen materialen. Het heeft een mtllib-regel die een .mtl ernaast noemt en usemtl-regels die tussen de items in dat bestand wisselen, en de .mtl draagt de diffuse kleur, de spiegelwaarden en de paden naar de textuurafbeeldingen. Deze converter leest v-, o-, g- en f-regels en negeert de rest.

Het gevolg is ondubbelzinnig en de moeite waard om rekening mee te houden: je GLB bevat geometrie en groepsnamen, en je viewer tekent het in wat voor standaardmateriaal hij ook heeft. Moest het model met zijn texturen getoond worden, dan is de route Blender — importeer de OBJ met zijn MTL, exporteer daarna glTF Binary, wat de afbeeldingen in de GLB verpakt. Deze pagina is voor het geval waarin de vorm de opgeleverde zaak is.

Wat er in de GLB komt die de converter bouwt

Een binaire glTF 2.0: een header van twaalf bytes, een JSON-blok met spaties opgevuld tot een grens van vier bytes, dan een binair blok opgevuld met nullen. Binnen de JSON: één mesh per OBJ-groep, één node per mesh, één scène die ze allemaal opsomt, een assetversie van 2.0, en per mesh een float32 VEC3-positieaccessor en een uint32 SCALAR-indexaccessor.

Elke positieaccessor draagt min en max. Dat is een specificatie-eis en het is ook het praktische verschil tussen een model dat verschijnt bij het laden en een dat dat niet doet — model-viewer en three.js leiden allebei de aanvangscameraafstand af van die grenzen, en bestanden zonder die grenzen zijn een gangbare oorzaak van een schijnbaar lege scène.

Elke OBJ-groep wordt een mesh, en elke mesh kost een draw call

De lezer start een nieuwe groep bij elke o- of g-regel en de schrijver geeft één glTF-mesh per groep, elk in zijn eigen node met zijn eigen primitive. Een OBJ geëxporteerd uit CAD met een groep per vlakstuk kan honderden groepen dragen, en de GLB zal trouw honderden meshes bevatten.

Op een pagina is dat een echte kostenpost. Elke primitive is een aparte draw call en een aparte GPU-bufferbinding, en een paar honderd daarvan op een middenklassetelefoon is waar de beeldsnelheid instort. Objecten samenvoegen in Blender voordat je de OBJ exporteert, of de g-regels wegstrepen met een teksteditor als de groepen niets betekenen, is een fix van twee minuten die meer waard is dan de meeste dingen die erna gebeuren.

Vlakke belichting, en waarom de GLB als een low-poly-model oogt

Er wordt geen NORMAL-attribuut geschreven. De glTF-specificatie is duidelijk over wat een viewer dan moet doen: vlakke gezichtsnormalen berekenen. Dus een bol die glad oogde in je modelleersoftware toont in de browser elke driehoek als apart facet, wat als een bewuste low-poly-stijl overkomt en dat meestal niet is.

Er zijn twee schone oplossingen. In three.js roep je computeVertexNormals aan op de geladen geometrie, wat de gezichtsnormalen per vertex middelt en vereist dat de mesh netjes aan elkaar zit — wat het geval is, want posities worden tijdens de omzetting samengevoegd op zes decimalen. Of doe de normalenpas stroomopwaarts in Blender en exporteer daar glTF vandaan, wat ook de materialen meebrengt.

Op-as en schaal: twee dingen die een OBJ nooit verklaart

glTF legt beide vast. Het is rechtshandig, Y-omhoog, en zijn lineaire eenheid is de meter. OBJ legt geen van beide vast: het is een lijst getallen zonder kop, zonder eenheid en zonder asconventie, en elke toepassing die er een schrijft heeft zijn eigen gewoonte.

Er wordt hier geen omzetting toegepast, dus een Z-omhoog-OBJ levert een GLB op wiens model op zijn rug ligt, en een in centimeters ontworpen OBJ levert er een op die tweehonderd meter hoog is. Beide zijn triviaal te herstellen zodra je weet welke je hebt — een rotatie van min negentig graden om X, en een uniforme schaal — en beide zijn onzichtbaar tot je het bestand laadt. De begrenzingsbox tegen een bekende afmeting afzetten is de snelste diagnose.

Wat de OBJ-lezer doet voordat de GLB geschreven wordt

Vlakken met meer dan drie hoeken worden waaiervormig gedriehoekt vanaf de eerste hoek, wat correct is voor de convexe vierhoeken en n-hoeken die deze bestanden normaal bevatten en overlappende driehoeken kan geven bij een concaaf vlak. Negatieve vlakindexen, die terugtellen vanaf de meest recente vertex, worden opgelost terwijl het bestand wordt gelezen in plaats van achteraf, omdat hun betekenis afhangt van de positie in het bestand.

Posities worden dan samengevoegd: gematcht op zes decimalen, dus een coördinaat die in twintig driehoeken voorkomt wordt eenmaal opgeslagen en twintig keer aangehaald. Dat verkleint zowel de buffer als geeft de browser een mesh met echte samenhang, wat is wat computeVertexNormals gladde belichting laat opleveren in plaats van hetzelfde vlakke resultaat.

De omvang van de GLB, en hoe je hem kleiner maakt

Twaalf bytes per vertex voor posities en twaalf bytes per driehoek voor indexen, plus een kleine JSON-header. Een model van 200.000 driehoeken met 100.000 vertices is dus rond de 3,6 MB, en niets daarvan is gecomprimeerd. Indexen zijn uitzonderingsloos uint32, wat vier bytes kost waar twee zouden volstaan onder 65.535 vertices en een voorwaarde vermijdt die stilletjes op een drempel van gedrag verandert.

Is dat getal te groot voor de pagina, dan liggen de antwoorden stroomopwaarts en stroomafwaarts, niet hier: decimeer de mesh eerst in Blender of MeshLab, en draai daarna gltf-transform voor Draco- of meshopt-compressie — met in het achterhoofd dat beide vereisen dat de browser een bijpassende decoder laadt, wat op een pagina die één model toont een eigen kostenpost is.

Wanneer een OBJ nog niet klaar is voor het web

Als het model zijn texturen nodig heeft, converteer dan via Blender zodat de MTL en zijn afbeeldingen meekomen. Als het model een half miljoen driehoeken heeft, decimeer voor het omzetten in plaats van het te versturen en te hopen. Moet het glad ogen, regel normalen dan in de viewer of in de exporteur, want deze route levert er geen.

Waar deze pagina wel goed voor is, is het eerlijke middengeval: een schone OBJ van een onderdeel, een prop of een scan die op een pagina moet verschijnen als vorm, in één bestand, zonder het model naar iemand te uploaden. Die omzetting draait volledig in je browser, zonder engine om te downloaden en met een plafond van 100 MB, en levert een bestand op dat elke huidige webviewer aankan.

Zo zet je OBJ naar GLB om

  1. Sleep je OBJ-bestand op deze pagina, of klik om er een te kiezen.
  2. Kies GLB als doel. De omzetting gebeurt in je browser en het bestand wordt niet geüpload.
  3. Download het klare GLB-bestand.

OBJ of GLB: wat er verandert

OBJ vergeleken met GLB
OBJGLB
Volledige naamWavefront-objectBinary glTF
Bestandsextensie.obj.glb
Mediatypemodel/objmodel/gltf-binary
Voor het eerst gepubliceerd19922016
Uitgegeven doorWavefront TechnologiesKhronos Group
SpecificatieglTF 2.0
LicentieOpen standaardOpen standaard
Stand van zakenActueelActueel
Opent in een browserGeen browserGeen browser
In plaats daarvan overwogenGLTF, PLY, STLGLTF

Het resultaat openen

Blender leest zowel OBJ als GLB, dus je kunt het resultaat naast het origineel leggen zonder een tweede programma.

Waarvoor elk formaat bedoeld is

De twee mikken op ander werk: OBJ op gegevens tussen programma’s verplaatsen en bewerken, GLB op het web en een af bestand overdragen. Dat is het afwegen waard, want de reden dat het ene bestaat is meestal de reden dat het andere onhandig is.

GLB komt van Khronos Group en stamt uit 2016, vastgelegd in glTF 2.0. Blender, three.js en Babylon.js lezen het formaat.

OBJ verscheen in 1992 en GLB in 2016. Het oudste is doorgaans het veiligste bestand om te overhandigen; het nieuwste doet hetzelfde werk met minder bytes.

Van OBJ naar GLB: veelgestelde vragen

Wordt mijn OBJ-bestand ergens heen geüpload?

Nee. Deze omzetting gebeurt volledig in je browser, dus het bestand verlaat je apparaat niet. Je kunt het zelf nagaan: open het netwerktabblad van de ontwikkelaarshulpmiddelen en zet iets om. Je ziet de pagina zelf en de verzoeken voor statistiek en advertenties waarmee deze dienst betaald wordt, en geen enkel verzoek dat je bestand meeneemt.

Is OBJ naar GLB omzetten gratis?

Ja. Geen account, geen watermerk en geen dagtegoed dat opraakt: het draait op je eigen machine, dus je mag zo vaak terugkomen als je wilt. De browser verwerkt bestanden tot 100 MB, 100 tegelijk.

Gaat er kwaliteit verloren bij het omzetten van OBJ naar GLB?

OBJ en GLB beschrijven de inhoud op fundamenteel andere manieren. De omzetting is daarom een reconstructie en geen kopie: getrouw, maar niet byte voor byte identiek. Alleen de meetkunde. Materialen, kleuren, texturen en animatie gaan niet mee, en een model dat meerdere keren geplaatst is komt terug met elke kopie vastgezet op zijn eigen plek.

Moet ik iets installeren om een GLB-bestand te openen?

Voor de omzetting niet: die gebeurt in de browser die je al open hebt staan. Om het resultaat te openen heb je daarna het programma nodig waarmee je apparaat Binary glTF normaal weergeeft.

Meer over deze formaten