Skip to content
Novus Examples
obj1.1 KB

OBJ — Inverted Normals / Mixed Winding

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.

Loading 3D preview…

Interactive preview rendered from the equivalent glTF (inverted-normals.glb); drag to orbit. Download the file above for the OBJ original.

Specifications

Format
Wavefront OBJ
Vertices
8
Triangles
12
Inverted Triangles
6
Inverted Cube Faces
3
Winding Consistent
false
Signed Volume
0
Correct Volume
1
Note
vn records follow the reversed winding

Testing contract

Expected to recover
Scenario
Compute the divergence-theorem signed volume from the face windings, then run a recalculate-normals or unify-winding pass and compute it again.
Expected result
Before the fix the signed volume is 0.0, because the three reversed faces subtract exactly what the three correct ones add; afterwards it is 1.0 and every normal points outward.

What is a .obj file?

OBJ (Wavefront OBJ) is a text-based 3D geometry format defining vertices, texture coordinates, normals, and faces, and referencing materials through a companion MTL file. It is simple, widely supported, and can represent polygonal meshes with UV mapping. It is a common interchange format across 3D tools.

How to use this file

Use an example OBJ to test mesh and UV parsing, MTL material resolution, and importers in 3D engines, renderers, and modeling applications.

How to use this file for testing

“OBJ — Inverted Normals / Mixed Winding” is a deterministic Novus Examples fixture for Mesh repair testing, Mesh processing QA. A watertight mesh paired with a deliberately broken twin (holes, missing faces, open ends) — the input and intended result for a mesh-repair / hole-filling tool.

Documented properties for this file: Wavefront OBJ. Compare results against paired or grouped companions on this page when present (clean↔damaged, searchable↔scanned, or format twins) so scores stay reproducible across runs.

Download the file once, keep the path stable in CI or local scripts, and treat the spec table as the contract: dimensions, seeds, field lists, and roles are intentional. Corrupt or invalid samples are labelled as such — expect parsers to fail loudly rather than silently accept them.

3D and CAD fixtures carry one small, documented solid or scene. Convert and inspect against the known geometry, units, and structure; format twins let you diff interchange fidelity, and the 3D viewer previews the actual mesh.

Code examples

import trimesh  # pip install trimesh

mesh = trimesh.load("inverted-normals.obj")
print(mesh.bounds, mesh.faces.shape)

Generated by generation/models_p7.py. Free for any use, no attribution required — license.