3D Object File Type Converter
Convert 3D model files between OBJ, STL, PLY, and glTF/GLB formats entirely in your browser. Free, private, no upload required.
Drop 3D file here or click to browse
OBJ ⢠STL ⢠PLY ⢠GLTF ⢠GLB
About
Converting between 3D file formats introduces silent data loss if the converter does not map attribute channels correctly. A vertex color array present in PLY vanishes when written to STL because STL carries no color payload. Normals stored per-face in binary STL must be recomputed as per-vertex averages when targeting OBJ with vn directives. This tool parses source geometry into a canonical intermediate representation - an indexed triangle mesh with positions P, normals N, texture coordinates UV, and RGBA vertex colors C - then serializes only the channels the target format supports. All processing runs client-side in a Web Worker. No file data leaves your machine.
Supported input and output formats: Wavefront OBJ (ASCII), STL (binary and ASCII), Stanford PLY (ASCII and binary little-endian), and glTF 2.0 / GLB (binary container). Quad faces are tessellated into triangles via fan decomposition. The tool approximates topology-preserving conversion assuming manifold input. Degenerate triangles (area < 1e-10) are flagged but preserved. Pro tip: if your exported STL renders with inverted faces, the source winding order was clockwise - check the "flip normals" option before converting.
Formulas
The converter transforms source geometry into a canonical indexed triangle mesh. Each vertex stores position P ā R3, optional normal N ā R3, optional texture coordinate UV ā R2, and optional color C ā [0,1]4.
Face normal recomputation from triangle vertices A, B, C:
Nface = (B ā A) Ć (C ā A)|(B ā A) Ć (C ā A)|Per-vertex smooth normals are computed as the area-weighted average of adjacent face normals:
Nvertex = āf ā adj Af ā Nf|āf ā adj Af ā Nf|Quad fan tessellation splits an n-gon face [v0, v1, ā¦, vnā1] into n ā 2 triangles:
[v0, vi, vi+1] ā for ā i = 1, ā¦, n ā 2Binary STL triangle count from file size:
T = fileSize ā 8450Where each triangle record is 50 bytes: 12 bytes normal + 36 bytes vertices (3 Ć 3 Ć 4 bytes float32) + 2 bytes attribute count. Header is 80 bytes + 4 bytes triangle count.
Where Af is the area of face f, Nf is the unit normal of face f, and adj is the set of faces sharing the vertex.
Reference Data
| Format | Extension | Encoding | Vertices | Normals | UVs | Vertex Colors | Materials | Quads | Max Typical Size |
|---|---|---|---|---|---|---|---|---|---|
| Wavefront OBJ | .obj | ASCII | ✓ | ✓ per-vertex | ✓ | ✗ | External .mtl | ✓ | ~500 MB |
| STL (Binary) | .stl | Binary LE | ✓ | ✓ per-face | ✗ | ✗ | ✗ | ✗ | ~200 MB |
| STL (ASCII) | .stl | ASCII | ✓ | ✓ per-face | ✗ | ✗ | ✗ | ✗ | ~50 MB |
| Stanford PLY (ASCII) | .ply | ASCII | ✓ | ✓ | ✓ | ✓ RGBA | ✗ | ✗ | ~300 MB |
| Stanford PLY (Binary) | .ply | Binary LE | ✓ | ✓ | ✓ | ✓ RGBA | ✗ | ✗ | ~500 MB |
| glTF 2.0 | .gltf | JSON + Base64 | ✓ | ✓ | ✓ | ✓ | PBR inline | ✗ | ~100 MB |
| GLB | .glb | Binary container | ✓ | ✓ | ✓ | ✓ | PBR inline | ✗ | ~500 MB |
| FBX | .fbx | Binary/ASCII | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Not supported here |
| COLLADA | .dae | XML | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Not supported here |
| 3DS | .3ds | Binary chunks | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ | Not supported here |
| AMF | .amf | XML/ZIP | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | Not supported here |
| 3MF | .3mf | ZIP/XML | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | Not supported here |
| OFF | .off | ASCII | ✓ | ✗ | ✗ | Optional | ✗ | ✓ | ~100 MB |
| X3D | .x3d | XML | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Not supported here |
| VRML | .wrl | ASCII | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Not supported here |