3D Tiles: what they are and how to load them
Quick answer
This tutorial explains how 3D Tiles turns multi-gigabyte photogrammetry, BIM and point cloud data into a level-of-detail tree that streams by view distance. It dissects tileset.json fields such as geometricError, boundingVolume, refine and content.uri, then loads a tileset with Cesium3DTileset.fromUrl and tunes maximumScreenSpaceError and maximumMemoryUsage. Readers can load, frame and troubleshoot a 3D Tiles dataset and know when glTF alone is enough.
Key points
- Load with await Cesium3DTileset.fromUrl to get a promise and add it to scene.primitives.
- Lower maximumScreenSpaceError for finer detail, raising it when the first frame stalls.
- Check root.transform when a valid tileset.json renders nothing or renders underground.
Example
{
"asset": { "version": "1.1" },
"geometricError": 500,
"root": {
"boundingVolume": {
"region": [-1.3197, 0.6989, -1.3196, 0.6990, 0, 400]
},
"geometricError": 200,
"refine": "ADD",
"content": { "uri": "tiles/0/0/0.b3dm" },
"children": [
{
"boundingVolume": { "box": [0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 50] },
"geometricError": 50,
"content": { "uri": "tiles/1/0/0.b3dm" }
}
]
}
}var tileset = await Cesium.Cesium3DTileset.fromUrl(
'https://your-host/path/tileset.json',
{
maximumScreenSpaceError: 16, // 数值越小越精细,也越吃性能
maximumMemoryUsage: 512, // 缓存上限,单位 MB
skipLevelOfDetail: false // 开启可加快首屏,但可能闪
}
);
viewer.scene.primitives.add(tileset);
await viewer.zoomTo(tileset);
Notes
- A missing transform makes content use Earth-centred coordinates, so models vanish or collapse.
- Models float or clip without terrain because heightReference and terrain disagree.
English edition written for Atlaslog. Code is taken from the original Chinese page and runs unchanged.
Atlaslog (2026). 3D Tiles: what they are and how to load them. https://www.jingweizhi.com/en/cesium/tutorials/tileset-basics.html (accessed 2026-11-03).