/cesiumjs-terrain-environment
CesiumJS terrain, globe, and environment - TerrainProvider, Globe, sampleTerrain, atmosphere, sky, fog, lighting, shadows, panoramas. Use when configuring terrain providers, querying terrain heights, customizing atmosphere or sky rendering, adding panoramas, or adjusting scene
$ npx -y skills add CesiumGS/cesiumjs-skills --skill cesiumjs-terrain-environment --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/cesiumjs-terrain-environment
Context preview
The summary Claude sees to decide when to auto-load this skill.
CesiumJS terrain, globe, and environment - TerrainProvider, Globe, sampleTerrain, atmosphere, sky, fog, lighting, shadows, panoramas. Use when configuring terrain providers, querying terrain heights, customizing atmosphere or sky rendering, adding panoramas, or adjusting scene
SKILL.md
cesiumjs-terrain-environment.SKILL.mdname: cesiumjs-terrain-environment
description: "CesiumJS terrain, globe, and environment - TerrainProvider, Globe, sampleTerrain, atmosphere, sky, fog, lighting, shadows, panoramas. Use when configuring terrain providers, querying terrain heights, customizing atmosphere or sky rendering, adding panoramas, or adjusting scene lighting and shadows."
CesiumJS Terrain, Globe & Environment
Version baseline: CesiumJS v1.143 | ES module imports (`import { ... } from "cesium";`)
Terrain Providers
Terrain is served through `TerrainProvider` implementations. Use async factory methods (`fromIonAssetId`, `fromUrl`), not the constructor directly.
Cesium Ion World Terrain
import { Viewer, Terrain } from "cesium";
const viewer = new Viewer("cesiumContainer", {
terrain: Terrain.fromWorldTerrain({
requestVertexNormals: true, // smoother lighting
requestWaterMask: true, // ocean water effect
}),
});CesiumTerrainProvider from Ion Asset / URL
import { CesiumTerrainProvider } from "cesium";
// By Ion asset ID (e.g. 3956 = Arctic DEM)
const tp = await CesiumTerrainProvider.fromIonAssetId(3956, {
requestVertexNormals: true,
});
viewer.scene.globe.terrainProvider = tp;
// By URL (self-hosted terrain server)
const tp2 = await CesiumTerrainProvider.fromUrl(
"https://my-server.example.com/terrain",
{ requestVertexNormals: true },
);EllipsoidTerrainProvider (Flat Globe)
import { EllipsoidTerrainProvider } from "cesium";
// Flat ellipsoid -- no terrain data, useful for 2D/Columbus or testing
viewer.scene.globe.terrainProvider = new EllipsoidTerrainProvider();CustomHeightmapTerrainProvider (Procedural)
import { CustomHeightmapTerrainProvider } from "cesium";
viewer.scene.globe.terrainProvider = new CustomHeightmapTerrainProvider({
width: 32,
height: 32,
callback: function (x, y, level) {
const buf = new Float32Array(32 * 32);
for (let r = 0; r < 32; r++) {
for (let c = 0; c < 32; c++) {
buf[r * 32 + c] = Math.sin((x + c / 32) * 6.28) * 5000;
}
}
return buf;
},
});Sampling Terrain Heights
Both functions mutate the input `Cartographic[]` in place (setting `.height`) and return a promise resolving to the same array.
import { sampleTerrain, sampleTerrainMostDetailed, Cartographic } from "cesium";
const positions = [
Cartographic.fromDegrees(86.925145, 27.988257), // Mt Everest
Cartographic.fromDegrees(87.0, 28.0),
];
// Fixed LOD level -- fast, approximate
await sampleTerrain(viewer.scene.globe.terrainProvider, 11, positions);
// Max available LOD -- slower, most precise
// Requires provider.availability (e.g. CesiumTerrainProvider)
await sampleTerrainMostDetailed(viewer.scene.globe.terrainProvider, positions);
// positions[0].height is now populated
// Pass true as 3rd arg to reject on tile failure instead of undefined heights
await sampleTerrainMostDetailed(provider, positions, true);Clamped-Height Callback Correctness (1.143+)
CesiumJS 1.143 fixes the internal `Scene.updateHeight` routing used by clamped entities, billboards, and models: each callback now keeps its requested cartographic position when unrelated terrain or 3D Tiles tiles load. Prefer public `HeightReference` values and upgrade to 1.143+ rather than calling the private `Scene.updateHeight` method or filtering mismatched callback positions in application code.
Globe Configuration
Access via `viewer.scene.globe`. Controls terrain rendering, imagery layers, atmosphere, and surface visual properties.
const globe = viewer.scene.globe;
globe.show = true;
globe.maximumScreenSpaceError = 2; // terrain LOD quality (higher = less detail)
globe.tileCacheSize = 100; // tiles kept in memory
// Lighting
globe.enableLighting = true;
globe.dynamicAtmosphereLighting = true;
globe.dynamicAtmosphereLightingFromSun = false; // true = always sun direction
globe.lambertDiffuseMultiplier = 0.9;
// Atmosphere
globe.showGroundAtmosphere = true; // horizon glow (default true for WGS84)
globe.atmosphereHueShift = 0.0;
globe.atmosphereSaturationShift = 0.0;
globe.atmosphereBrightnessShift = 0.0;
// Surface behavior
globe.depthTestAgainstTerrain = false; // true = z-test entities vs terrain
globe.showWaterEffect = true; // animated ocean (needs water mask)
globe.shadows = Cesium.ShadowMode.RECEIVE_ONLY;
globe.baseColor = Cesium.Color.BLUE; // color when no imagery loaded
globe.backFaceCulling = true;
globe.showSkirts = true;
Globe.pick and Globe.getHeight
// Raycast to globe surface
const ray = viewer.camera.getPickRay(windowPosition);
const hit = viewer.scene.globe.pick(ray, viewer.scene);
// Synchronous height from cached tiles (may return undefined)
const h = viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(-105, 40));
Terrain Exaggeration
// Set on Scene, not Globe
viewer.scene.verticalExaggeration = 2.0;
viewer.scene.verticalExaggerationRelativeHeight = 0.0; // relative to sea level
Globe Translucency
Makes the globe see-through for underground/subsurface visualization.
const globe = viewer.scene.globe;
globe.translucency.enabled = true;
globe.translucency.frontFaceAlpha = 0.5;
globe.translucency.backFaceAlpha = 1.0;
// Distance-based alpha
globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar(
1.5e2, 0.5, // near: 150m, alpha 0.5
8.0e6, 1.0, // far: 8000km, alpha 1.0
);
// Limit to geographic region
globe.translucency.rectangle = Cesium.Rectangle.fromDegrees(-120, 30, -80, 50);
Elevation Band Material
Color the globe surface by elevation.
import { createElevationBandMaterial, Color } from "cesium";
viewer.scene.globe.material = createElevationBandMaterial({
scene: viewer.scene,
layers: [{
entries: [
{ height: 0, color: new Color(0.0, 0.0, 0.5, 1.0) },
{ height: 500, color: new Color(0.0, 0.8, 0.0, 1.0) },
{ height: 2000, color: nRead more
name: cesiumjs-terrain-environment description: "CesiumJS terrain, globe, and environment - TerrainProvider, Globe, sampleTerrain, atmosphere, sky, fog, lighting, shadows, panoramas. Use when configuring terrain providers, querying terrain heights, customizing atmosphere or sky rendering, adding panoramas, or adjusting scene lighting and shadows."
CesiumJS Terrain, Globe & Environment
Version baseline: CesiumJS v1.143 | ES module imports (`import { ... } from "cesium";`)
Terrain Providers
Terrain is served through `TerrainProvider` implementations. Use async factory methods (`fromIonAssetId`, `fromUrl`), not the constructor directly.
Cesium Ion World Terrain
import { Viewer, Terrain } from "cesium";
const viewer = new Viewer("cesiumContainer", {
terrain: Terrain.fromWorldTerrain({
requestVertexNormals: true, // smoother lighting
requestWaterMask: true, // ocean water effect
}),
});CesiumTerrainProvider from Ion Asset / URL
import { CesiumTerrainProvider } from "cesium";
// By Ion asset ID (e.g. 3956 = Arctic DEM)
const tp = await CesiumTerrainProvider.fromIonAssetId(3956, {
requestVertexNormals: true,
});
viewer.scene.globe.terrainProvider = tp;
// By URL (self-hosted terrain server)
const tp2 = await CesiumTerrainProvider.fromUrl(
"https://my-server.example.com/terrain",
{ requestVertexNormals: true },
);EllipsoidTerrainProvider (Flat Globe)
import { EllipsoidTerrainProvider } from "cesium";
// Flat ellipsoid -- no terrain data, useful for 2D/Columbus or testing
viewer.scene.globe.terrainProvider = new EllipsoidTerrainProvider();CustomHeightmapTerrainProvider (Procedural)
import { CustomHeightmapTerrainProvider } from "cesium";
viewer.scene.globe.terrainProvider = new CustomHeightmapTerrainProvider({
width: 32,
height: 32,
callback: function (x, y, level) {
const buf = new Float32Array(32 * 32);
for (let r = 0; r < 32; r++) {
for (let c = 0; c < 32; c++) {
buf[r * 32 + c] = Math.sin((x + c / 32) * 6.28) * 5000;
}
}
return buf;
},
});Sampling Terrain Heights
Both functions mutate the input `Cartographic[]` in place (setting `.height`) and return a promise resolving to the same array.
import { sampleTerrain, sampleTerrainMostDetailed, Cartographic } from "cesium";
const positions = [
Cartographic.fromDegrees(86.925145, 27.988257), // Mt Everest
Cartographic.fromDegrees(87.0, 28.0),
];
// Fixed LOD level -- fast, approximate
await sampleTerrain(viewer.scene.globe.terrainProvider, 11, positions);
// Max available LOD -- slower, most precise
// Requires provider.availability (e.g. CesiumTerrainProvider)
await sampleTerrainMostDetailed(viewer.scene.globe.terrainProvider, positions);
// positions[0].height is now populated
// Pass true as 3rd arg to reject on tile failure instead of undefined heights
await sampleTerrainMostDetailed(provider, positions, true);Clamped-Height Callback Correctness (1.143+)
CesiumJS 1.143 fixes the internal `Scene.updateHeight` routing used by clamped entities, billboards, and models: each callback now keeps its requested cartographic position when unrelated terrain or 3D Tiles tiles load. Prefer public `HeightReference` values and upgrade to 1.143+ rather than calling the private `Scene.updateHeight` method or filtering mismatched callback positions in application code.
Globe Configuration
Access via `viewer.scene.globe`. Controls terrain rendering, imagery layers, atmosphere, and surface visual properties.
const globe = viewer.scene.globe; globe.show = true; globe.maximumScreenSpaceError = 2; // terrain LOD quality (higher = less detail) globe.tileCacheSize = 100; // tiles kept in memory // Lighting globe.enableLighting = true; globe.dynamicAtmosphereLighting = true; globe.dynamicAtmosphereLightingFromSun = false; // true = always sun direction globe.lambertDiffuseMultiplier = 0.9; // Atmosphere globe.showGroundAtmosphere = true; // horizon glow (default true for WGS84) globe.atmosphereHueShift = 0.0; globe.atmosphereSaturationShift = 0.0; globe.atmosphereBrightnessShift = 0.0; // Surface behavior globe.depthTestAgainstTerrain = false; // true = z-test entities vs terrain globe.showWaterEffect = true; // animated ocean (needs water mask) globe.shadows = Cesium.ShadowMode.RECEIVE_ONLY; globe.baseColor = Cesium.Color.BLUE; // color when no imagery loaded globe.backFaceCulling = true; globe.showSkirts = true;
Globe.pick and Globe.getHeight
// Raycast to globe surface const ray = viewer.camera.getPickRay(windowPosition); const hit = viewer.scene.globe.pick(ray, viewer.scene); // Synchronous height from cached tiles (may return undefined) const h = viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(-105, 40));
Terrain Exaggeration
// Set on Scene, not Globe viewer.scene.verticalExaggeration = 2.0; viewer.scene.verticalExaggerationRelativeHeight = 0.0; // relative to sea level
Globe Translucency
Makes the globe see-through for underground/subsurface visualization.
const globe = viewer.scene.globe; globe.translucency.enabled = true; globe.translucency.frontFaceAlpha = 0.5; globe.translucency.backFaceAlpha = 1.0; // Distance-based alpha globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar( 1.5e2, 0.5, // near: 150m, alpha 0.5 8.0e6, 1.0, // far: 8000km, alpha 1.0 ); // Limit to geographic region globe.translucency.rectangle = Cesium.Rectangle.fromDegrees(-120, 30, -80, 50);
Elevation Band Material
Color the globe surface by elevation.
import { createElevationBandMaterial, Color } from "cesium";
viewer.scene.globe.material = createElevationBandMaterial({
scene: viewer.scene,
layers: [{
entries: [
{ height: 0, color: new Color(0.0, 0.0, 0.5, 1.0) },
{ height: 500, color: new Color(0.0, 0.8, 0.0, 1.0) },
{ height: 2000, color: nShowing the first part of this file.
Curated agent skills for CesiumJS development — 14 domain skills covering ~551 public symbols across the CesiumJS v1.143 API surface.
Repo: CesiumGS/cesiumjs-skills
Other skills on cesiumjs-skills.
- /cesiumjs-3d-tiles
CesiumJS 3D Tiles - Cesium3DTileset, compressed and CAD-style glTF content, MVTDataProvider, styling, metadata, feature picking, voxels, point clouds, I3S, Gaussian splats, clipping. Use when loading 3D Tiles or Mapbox Vector Tiles, rendering KHR meshopt/CAD content, styling or
Open skill - /cesiumjs-camera
CesiumJS camera control - Camera, flyTo, lookAt, setView, ScreenSpaceCameraController, CameraEventAggregator, flight animation. Use when positioning the camera, creating flyTo animations, constraining user navigation, tracking entities, or converting between screen and world
Open skill - /cesiumjs-core-utilities
CesiumJS core utilities and networking - Resource, Color, Event, Request, RequestScheduler, error handling, helper functions, feature detection. Use when fetching remote data, managing HTTP requests, working with colors, handling events, debugging errors, or using utility
Open skill - /cesiumjs-custom-shader
CustomShader authoring — vertexShaderText and fragmentShaderText against VertexInput, FragmentInput, FeatureIds, Metadata, czm_modelMaterial. Use when reading EXT_mesh_features or EXT_structural_metadata property textures/tables, vertex displacement, or shading VoxelPrimitive.
Open skill - /cesiumjs-entities
CesiumJS entities and data sources - Entity, EntityCollection, DataSource, GeoJsonDataSource, KmlDataSource, CzmlDataSource, Graphics types, PathGraphics, PathMode, Visualizers. Use when adding points, labels, models, polygons, polylines, or time-segmented paths, loading
Open skill - /cesiumjs-imagery
CesiumJS imagery layers - ImageryProvider, ImageryLayer, ImageryLayerCollection, WMS, WMTS, Bing, OpenStreetMap, ArcGIS, Mapbox, tile discard policies. Use when adding or swapping base map layers, configuring imagery providers, layering multiple map sources, or creating
Open skill

