3dtiled-to-3dtiles
Guide (from README.md)

Ambition

This started as a set of Node.js SDK/CLI, standalone-packaged, converters: take a tiled / LoD source format — HLOD Hierarchical Level of Det

This started as a set of Node.js SDK/CLI, standalone-packaged, converters: take a tiled / LoD source format — HLOD Hierarchical Level of Detail, tiled point clouds, meshes, or 3D Gaussian splats (COPC, Potree, I3S, stream-SOG, LCC, RAD, 3MX, GeoSplats, …) — and turn it into OGC 3D Tiles 1.1 (splats via KHR_gaussian_splatting + KHR_gaussian_splatting_compression_spz_2 GLB tiles). The unifying idea behind every converter is the same: translate each of the tree-hierarchy and tile-geometry as-is, since each source format is already some spatial tree of pre-tiled, LoD'd content — so the converter just maps that tree onto a 3D Tiles HLOD tree, implicit (octree/quadtree) or explicit (arbitrary), and re-encodes node content into one shared output (standard mesh primitives, TRIANGLES, POINTS, or spzGlb.js for splats). The decode differs per format; the output is uniform.

It has since grown into an on-the-fly streaming middleware (packages/tile-server, the offline converters' live counterpart): point it at a <format> source URL and it serves a 3D Tiles tileset live, so any 3D-Tiles-compatible client — browser/JS viewers, CesiumJS or its native plugins (Unreal, Unity, Nvidia Omniverse, Open-3d-Engine), GIS software (QGIS, ESRI etc), anything that speaks the OGC standard — can consume any of these tiled formats without a pre-conversion step, with tile-hierarchy/content caching and prefetching tunable per use case (cache=none|hierarchy|all). viewer.html (CesiumJS + 3DTilesRendererJS) is the reference client, and doubles as a bbox + geometric-error-aware crop/extract tool (/extract/*) for pulling a sub-region, with user-controlled Geometric Error target precision, of any of these formats back out as LAS/COPC/GLB/SPZ/SOG/PLY.

Where this is going next. Two items are concrete and addressable in the near term, not just aspirational: containerizing the server — a docker-compose-runnable packages/tile-server (+ viewer), built and published to GHCR by a GitHub Actions workflow on release, so it drops straight into a docker-compose/Portainer stack behind Traefik with no manual Node setup — and a Fumadocs documentation site, which is more tractable than it sounds: almost every format's deep findings already live in their own file under docs/references/ (this README mostly links to them rather than duplicating), so the migration is largely chunking the existing material (this README foremost, plus a few docs-references files that have grown large in their own right) into Fumadocs' page-per-topic model, not writing new docs from scratch. Both are tracked in TODO / Future work below.

Further out: a browser/server tiled-splat transcoding UI in the spirit of SuperSplat's splat-transform tooling; a georeferencing/geolocator step for splats that don't ship one, along the lines of WilliamLiu's 3dtiles-inspector or MapTiler GeoSplats'; and an aggregator unifying the export/interchange formats of other splat platforms, behind the same 3D Tiles pipeline. A longer-running goal underneath all of this: be the fastest point-cloud — and eventually splat — tiler, by reusing the octree-computation principles behind Potree 2.0's converter (see the Potree sections throughout this doc, e.g. potree-to-3dtiles and /stream).