User Rating 0.0 ā˜…ā˜…ā˜…ā˜…ā˜…
Total Usage 0 times

Drop 3D file here or click to browse

OBJ • STL • PLY • GLTF • GLB

Is this tool helpful?

Your feedback helps us improve.

ā˜… ā˜… ā˜… ā˜… ā˜…

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.

3d converter obj to stl stl to obj ply converter gltf converter glb converter 3d model converter file converter mesh converter

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 āˆ’ 2

Binary STL triangle count from file size:

T = fileSize āˆ’ 8450

Where 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

FormatExtensionEncodingVerticesNormalsUVsVertex ColorsMaterialsQuadsMax Typical Size
Wavefront OBJ.objASCII✓ per-vertexExternal .mtl~500 MB
STL (Binary).stlBinary LE✓ per-face~200 MB
STL (ASCII).stlASCII✓ per-face~50 MB
Stanford PLY (ASCII).plyASCII✓ RGBA~300 MB
Stanford PLY (Binary).plyBinary LE✓ RGBA~500 MB
glTF 2.0.gltfJSON + Base64PBR inline~100 MB
GLB.glbBinary containerPBR inline~500 MB
FBX.fbxBinary/ASCIINot supported here
COLLADA.daeXMLNot supported here
3DS.3dsBinary chunksNot supported here
AMF.amfXML/ZIPNot supported here
3MF.3mfZIP/XMLNot supported here
OFF.offASCIIOptional~100 MB
X3D.x3dXMLNot supported here
VRML.wrlASCIINot supported here

Frequently Asked Questions

STL stores only triangle positions and per-face normals. All texture coordinates (vt lines), vertex normals (vn lines), material references (usemtl/mtllib), and group names are discarded. If your workflow depends on UV mapping, convert to PLY or glTF instead.
Face winding order determines normal direction. OBJ uses counter-clockwise winding by convention, while some modeling tools export clockwise. Enable the "Flip Normals" option to reverse all face windings during conversion. The tool recomputes normals using the cross product of edge vectors in the order stored, so inconsistent winding in the source file produces inconsistent normals.
All non-triangle faces are tessellated into triangles using fan decomposition from vertex vā‚€. This preserves topology for convex polygons but may produce degenerate triangles on concave n-gons. If your source mesh contains concave quads, consider triangulating in your modeling application before export.
The converter runs entirely in browser memory. Practical limits depend on available RAM. Files under 50 MB convert in seconds. Files between 50-100 MB trigger a warning and may take 10-30 seconds. Files above 100 MB are rejected to prevent browser tab crashes. For very large meshes, consider decimation before conversion.
No. The binary STL specification allocates 2 bytes per triangle as an "attribute byte count" field, which some tools repurpose for color (e.g., VisCAM, SolidView use RGB555 encoding). This converter does not write to that non-standard field. Vertex colors are silently dropped when targeting STL. Use glTF or PLY as the output format to preserve color data.
OBJ allows different index combinations per attribute channel (e.g., position index 5 with UV index 12 and normal index 3). glTF requires a single index buffer. The converter creates unique vertex entries for each distinct (position, normal, UV) combination and rebuilds the index buffer accordingly. This may increase vertex count but is required by the glTF 2.0 specification.
Yes. The converter outputs spec-compliant glTF 2.0 JSON or GLB binary. It uses accessor component types FLOAT for positions/normals/UVs and UNSIGNED_INT for indices. Both three.js GLTFLoader and Babylon.js SceneLoader.ImportMesh parse this output correctly. The converter sets the asset.generator field to an empty string for white-label compatibility.