Find files, editable templates and browser test targets by what you need to make or test. The directory below is cut by format; the two collections under it cut the same library by subject and by workflow.
The material library for the OBJ in this group, carrying both the original Phong fields and the de-facto PBR extensions (Pr roughness, Pm metallic, Ke emissive). The file that tells you whether an importer reads MTL's PBR additions or only its 1995 subset.
A single-image 3D reconstruction of tabby cat sitting on a windowsill, written as binary glTF, geometry addressed through an accessor table. Its twin in this group is the same mesh written as the other format, from ONE reconstruction rather than two runs - so the pair tests whether a reader returns the same geometry from two containers with nothing in common. Both hold 37,876 vertices and 75,752 triangles; those counts were read from the GLB's accessor table and by counting lines in the OBJ, by separate code, and a disagreement would have stopped this shipping. It is closed: every edge belongs to exactly two triangles, so there are no holes and no non-manifold edges. The bounding box measures 0.1382 x 1.0152 x 1.0194 units.
A single-image 3D reconstruction of tabby cat sitting on a windowsill, written as Wavefront text, one `v` line per vertex and one `f` line per face. Its twin in this group is the same mesh written as the other format, from ONE reconstruction rather than two runs - so the pair tests whether a reader returns the same geometry from two containers with nothing in common. Both hold 37,876 vertices and 75,752 triangles; those counts were read from the GLB's accessor table and by counting lines in the OBJ, by separate code, and a disagreement would have stopped this shipping. It is closed: every edge belongs to exactly two triangles, so there are no holes and no non-manifold edges. The bounding box measures 0.1382 x 1.0152 x 1.0194 units.
A single-image 3D reconstruction of golden retriever sitting on grass in a park, written as binary glTF, geometry addressed through an accessor table. Its twin in this group is the same mesh written as the other format, from ONE reconstruction rather than two runs - so the pair tests whether a reader returns the same geometry from two containers with nothing in common. Both hold 35,318 vertices and 70,636 triangles; those counts were read from the GLB's accessor table and by counting lines in the OBJ, by separate code, and a disagreement would have stopped this shipping. It is closed: every edge belongs to exactly two triangles, so there are no holes and no non-manifold edges. The bounding box measures 0.1048 x 1.0295 x 1.0232 units.
A single-image 3D reconstruction of golden retriever sitting on grass in a park, written as Wavefront text, one `v` line per vertex and one `f` line per face. Its twin in this group is the same mesh written as the other format, from ONE reconstruction rather than two runs - so the pair tests whether a reader returns the same geometry from two containers with nothing in common. Both hold 35,318 vertices and 70,636 triangles; those counts were read from the GLB's accessor table and by counting lines in the OBJ, by separate code, and a disagreement would have stopped this shipping. It is closed: every edge belongs to exactly two triangles, so there are no holes and no non-manifold edges. The bounding box measures 0.1048 x 1.0295 x 1.0232 units.
A welded, manifold, consistently-wound unit cube: 8 vertices, 12 triangles, 18 edges each shared by exactly two faces, and a signed volume of exactly 1.0. This is the answer key: each defect fixture in the degenerate/ subcategory is this mesh with exactly one thing wrong.
The reference cube with all eight corners stored twice at bit-identical coordinates: the first six triangles use one copy, the last six use the other. It renders as a closed cube but is topologically two disconnected surface patches with a split seam, which is why smoothing, subdivision and boolean operations all misbehave on it.
The reference cube with three of its six cube faces (six of its twelve triangles) wound clockwise instead of counter-clockwise, and `vn` records that follow the reversed winding into the solid. The classic symptom is a model that looks half-invisible with backface culling on and half-black with it off.
The same NaN vertex in Wavefront OBJ, where the literal is the bare token `nan`. Normals are deliberately not written, because the three faces touching that vertex have no computable normal, which is exactly the state an importer must handle rather than serialise.
The reference cube with a two-triangle fin welded along one top edge, so that edge is shared by three faces instead of two. Non-manifold edges have no defined surface orientation, which is why slicers refuse them and why subdivision and offsetting produce garbage.
A smooth-shaded sphere as Wavefront OBJ with `mtllib`/`usemtl` pointing at a sibling MTL. Downloading the OBJ alone gives you the classic missing-material case; downloading both reproduces the glTF metallic-roughness twin in this group.
The same signpost as OBJ with coordinates in metres. OBJ has no unit record of any kind, so the two OBJ files in this group are byte-different and semantically identical: the ambiguity that every OBJ import dialog's scale box exists to resolve.
The same signpost as OBJ with coordinates in millimetres. OBJ has no unit record of any kind, so the two OBJ files in this group are byte-different and semantically identical: the ambiguity that every OBJ import dialog's scale box exists to resolve.
The coarsest level as plain-text OBJ: 80 triangles you can read end to end. Small enough to paste into a bug report, which is what makes it useful when a pipeline mangles winding or normals and you need the smallest reproducer.
A 10 mm cube as a Wavefront OBJ, plain-text vertices and triangular faces, the lingua franca of 3D asset exchange. For testing OBJ importers and conversion.
The reference cube plus four triangles with no area, one for each way a mesh can have one: three collinear points, two coincident vertices at different indices, a repeated index, and all three indices identical. Their face normals are undefined, which is where downstream tools produce NaN.
A 10 mm cube as OFF (Object File Format): the minimal vertex/face text format from Geomview, common in computational geometry. For testing OFF parsers and conversion.
A 10 mm cube as ASCII PLY (Stanford polygon format), plain-text vertex and face lists common in 3D scanning and research. For testing PLY parsers and conversion.
The duplicated-corner cube as ASCII PLY: the format scanners and photogrammetry tools emit, and the one where unwelded duplicates are most common because each captured point arrives independently.
A structurally perfect ASCII PLY in which one vertex reads `nan nan nan`: the value an exporter writes after dividing by a zero-length vector. The header, counts and face list are all correct, so the file parses; every bounding box, centroid and normal computed from it is then poisoned.
The signpost as ASCII PLY with +Y up. PLY has no axis or unit element, so the convention survives only as a header comment that no parser reads: the reason scan data so often arrives rotated.
The signpost as ASCII PLY with +Z up. PLY has no axis or unit element, so the convention survives only as a header comment that no parser reads: the reason scan data so often arrives rotated.