Open a GLTF, GLB, OBJ, STL or FBX model and read what is really in it: distinct vertices and position entries as two different numbers, triangles, whether the surface is closed, and a screenshot with the model on it.
Initializing in your browser…
Read every metadata block a file carries: EXIF from its TIFF structure, IPTC from its IIM records, XMP from its packet and the ICC colour profile from its header, with GPS converted to decimal degrees with the reference letters applied.
See an image through the two published models of colour vision deficiency, Machado 2009 and Vienot 1999, computed in linear light where those models are defined, with the colour pairs that stop being distinguishable listed by name.
Whole-pixel crops with the rectangle typed or dragged, checked by decoding the output and comparing it with the pixels that went in. Quarter turns and mirrors are exact permutations, so nothing is clipped.
Four models generated here, so their statistics are known before anything reads them.
Input
cube.obj · tetra.obj · a 16 by 16 grid · the same cube as a binary STL
What the page reports
in the file before after cube, vertices 8 36 8 cube, position entries 36 - 36 cube, triangles 12 12 12 tetrahedron, vertices 4 12 4 grid, vertices 289 1,536 289 screenshot, 844 x 528 opaque pixels 0 445,632 distinct colours 1 370
The triangle count was already right. The vertex count was `position.count`, which for a mesh with no index is three per triangle: a cube with eight corners read as 36 and a 289-vertex grid as 1,536. Both numbers are useful and they are different numbers, so both are now on the page with their names. And the screenshot was blank, because a WebGL context clears its drawing buffer as soon as the frame is composited unless it is told not to.
Open a GLTF, GLB, OBJ, STL or FBX model in the browser and read what is really in it: distinct vertices and position entries as the two different numbers they are, triangles, meshes, materials, animations, the bounding box, the surface area, whether the surface is closed, and the volume when it is.
See the triangle count, the bounding box and whether the surface is closed before slicing.
Check a model’s polygon count, materials and animations without opening a 3D suite.
Frame the model and take a screenshot for a ticket or a document.
Load the STL. The panel says how many triangles it has, whether the surface is closed and how many open edges there are if not, its bounding box in the file’s own units, and its volume.
Load a GLB and read the triangle count, the number of meshes, the number of materials and the number of animations before deciding whether it fits your budget.
Orbit to the angle that shows the problem and press Screenshot. The PNG has the model on it, which the previous version’s did not.
A model viewer has exactly two claims that can be checked, and this pass checked both against models this project GENERATED, so their contents were known before anything read them: a cube is 8 vertices and 12 triangles, a tetrahedron is 4 and 4, and a 16 by 16 grid is 289 and 512.
**A vertex count taken from one attribute is not a vertex count.** The viewer reported `position.count`, and for a mesh with no index, which is what an STL and most OBJ loads produce, every triangle carries its own three positions. So a cube with eight corners was reported as 36 vertices, a tetrahedron as 12, and the 289-vertex grid as 1,536. The triangle count was right all along. Both numbers are real and they answer different questions, so both are on the page now with their names: Vertices is the distinct positions in the file, Position entries is how many the geometry carries. The counting is done by this project’s own mesh module, the same code the fixture generator and the unit tests use, so the phrase "8 vertices and 12 triangles" means one thing in all three places.
**The screenshot was blank.** A WebGL context clears its drawing buffer as soon as the frame is composited unless it is created with `preserveDrawingBuffer`, so `toDataURL` returned a picture of nothing: measured at 844 by 528, one distinct colour, zero opaque pixels, and an 11 KB PNG that looked like a real file. The renderer now preserves its buffer and the frame is drawn again immediately before it is read; the same screenshot comes back with 445,632 opaque pixels and 370 distinct colours.
While the counting was being done properly, the rest of what a file contains came with it: how many separate meshes, how many materials, how many animations, the bounding box, the surface area, whether the surface is CLOSED (every edge shared by exactly two triangles) and how many open edges it has if not, the enclosed volume when it is closed, and the number of triangles with no area at all. Those are the things that decide whether a model will print, and none of them was previously shown.
One more thing was silently wrong: a file chosen before three.js had finished loading was accepted by the input and then dropped, because the loader returns immediately when the library is not there yet. The load now starts when the second of the two arrives, whichever that is.
The viewer itself is three.js with orbit controls: drag to rotate, scroll to zoom, right-drag to pan, with a reset. GLTF, GLB, OBJ, STL and FBX are read; an OBJ with no material gets a neutral one so it is visible. There are four lighting presets, a wireframe toggle, a grid and axes, a background colour, and auto-rotate. Everything is parsed and drawn in your browser and nothing is uploaded, which matters for an unreleased asset.
Because they answer different questions. Vertices is the distinct positions in the file: a cube has eight corners. Position entries is how many the geometry carries, and a mesh with no index carries three per triangle, so the same cube carries 36. The previous version reported only the second and called it the vertex count.
A WebGL context clears its drawing buffer as soon as the frame is composited unless it is created with preserveDrawingBuffer, so reading it back gave a picture of nothing: 844 by 528 of one colour with zero opaque pixels. It now preserves the buffer and redraws the frame immediately before reading it.
That every edge is shared by exactly two triangles, which is what a solid needs to be printable. When it is not, the page says how many edges are on the boundary, which is the size of the hole.
GLTF, GLB, OBJ, STL and FBX. An OBJ with no material library is given a neutral material so it is visible rather than black.
No. It is parsed and drawn in your browser, which matters for an unreleased asset.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.