Title: Best approach for rendering and interacting with 1000+ tower models on top of Google Photorealistic 3D Tiles
Hi everyone,
I’m building a web application using CesiumJS + React where users can explore network towers across the globe. Currently the application loads Google Photorealistic 3D Tiles (from Cesium ion) as the base layer, along with a custom cloud layer and some lighting effects.
For a small number of towers (~10–15), the current approach works fine. However, the project requirements have now changed and we may need to support 1000+ towers globally, and I want to ensure the architecture scales properly.
Current Setup
-
Frontend: React + CesiumJS
-
Base Layer: Google Photorealistic 3D Tiles (Cesium ion asset)
-
Additional Layers:
-
Custom skybox
-
Semi-transparent cloud layer (rectangle entity with texture)
-
-
Tower models: GLB models placed using
Cesium.Entitywithmodel.uri -
Tower metadata: Each tower has longitude, latitude, altitude, and height
-
Interaction:
-
Clicking on meshes inside the model shows information about that tower component
-
Uses
viewer.scene.pick()to detect mesh/node names
-
Current Rendering Strategy
-
Each tower has:
-
a billboard marker
-
a label
-
a 3D model
-
-
Camera distance determines whether the model is visible or not.
-
Visibility is updated on
viewer.camera.changed.
Example simplified logic:
if (distance < threshold) {
entity.show = true
} else {
entity.show = false
}
Concerns
The current implementation works for ~10 towers, but I’m concerned about scaling to 1000+ towers, especially since:
-
Google Photorealistic 3D Tiles already consume a lot of GPU resources.
-
Loading hundreds or thousands of GLB models as entities could affect performance.
-
The application needs to remain smooth while navigating the globe.
Questions
I would appreciate advice on the best approach for scaling this system.
-
What is the recommended strategy for rendering thousands of models globally in Cesium?
-
Should we continue using
Entitymodels? -
Would
ModelInstanceCollectionbe better if towers share geometry? -
Should towers be converted into a 3D Tiles dataset instead?
-
-
If towers are separate models, is it better to:
-
Load individual tilesets dynamically based on camera distance?
-
Or combine towers into a larger tileset grouped by region?
-
-
What is the typical pattern for level-of-detail (LOD)?
For example:-
markers at global zoom
-
simplified tower models at medium zoom
-
full detailed models when close
-
-
Can feature picking still work with 3D Tiles?
We currently detect clicks on individual tower components (meshes). If we move to a tileset-based approach, is there a recommended way to preserve this interaction? -
Are there any specific performance considerations when combining custom models with Google Photorealistic 3D Tiles?
Goal
The goal is to support hundreds to thousands of towers worldwide, while keeping the viewer smooth and responsive.
Any suggestions about architecture, rendering strategies, or best practices would be greatly appreciated.
Thanks!