simulated · 2026 · active

void-tiler

github.com/keiken-shin/void-tiler

Problem

Large 3D assets (photogrammetry, terrain, city models) must be split into tiles to stream at runtime — but naive splitting destroys them. Cuts through UV seams corrupt texturing; per-tile simplification opens cracks along boundaries; and level-of-detail hierarchies with guessed error values pop and shimmer.

void-tiler is a pipeline that partitions arbitrary GLB content into a 3D Tiles tileset while treating seams, attributes, and measured error as first-class constraints.

Architecture

A Python package with a CLI (void-tiler), staged as a pipeline:

  1. Ingestion — per-primitive GLB parsing, grouped by material (never merged across materials), keeping all attribute sets aligned: multiple TEXCOORD_n, NORMAL, COLOR_0.
  2. Seam detection — vectorized detection of attribute discontinuities across positional clones (vertices co-located in space but split in attribute space).
  3. Partitioning — content-adaptive triangle budgeting via METIS graph cuts with seam-aware edge weights; Morton-order spatial chunking as a portable fallback. Connectivity enforcement and optional boundary-refinement iterations on top of either.
  4. Simplification — per-tile decimation with meshoptimizer, attribute-aware error metric (weighted UV/normal/color terms), tile-boundary vertices locked so no cracks can open, UVs never interpolated across seams.
  5. HLOD generation — parent tiles carry actual simplified content with refine: REPLACE, and geometricError comes from measured simplification error, guaranteed monotonic — not a heuristic scale factor.
  6. Export — per-tile GLBs with materials and shared external textures, tileset.json, optional ECEF-georeferenced root transform (validated against pyproj), plus seam diagnostics, partition previews, and a JSON metrics report.

Decisions

  • Seams drive the cut. The partitioner biases graph-cut edge weights away from seam faces, because a cut through a seam is the single most expensive mistake a tiler can make.
  • Measured error over guessed error. HLOD geometricError is derived from actual simplification error, which is what makes refinement transitions predictable.
  • Lock boundaries, not quality. Crack-free simplification comes from constraint (boundary vertices locked) rather than post-hoc welding.
  • Fallbacks everywhere. METIS is optional (it does not build on Windows/MSVC); the Morton-order path keeps the pipeline fully portable.

Results

A working end-to-end tiler: GLB in, streaming 3D Tiles tileset out — with multiple UV sets preserved, crack-free LODs, real HLOD hierarchies, and per-stage benchmarks (wall time, peak RSS, output size). Developed alongside a terrain-flattening companion for integrating tiled content with real-world terrain.

← work · home