Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
fa4f844
3d tiles terrain
IanLilleyT Dec 16, 2021
c14a8a9
Fixes for 1.1
lilleyse Mar 16, 2022
e8a76fa
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jun 1, 2022
31d2611
Use subtree readyPromise instead of relying on previous when.js behav…
lilleyse Jun 1, 2022
2e73640
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jun 1, 2022
349f253
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jul 25, 2022
43d4fc3
Fix sampleTerrainMostDetailed when terrain provider hasn't loaded a s…
lilleyse Jul 27, 2022
237e337
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jan 2, 2023
b3c1a1d
Remove console.log
lilleyse Jan 2, 2023
3c86935
Fix doc issues
lilleyse Jan 2, 2023
1a03cf2
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jan 4, 2023
204fabd
Merge branch 'main' into 3d-tiles-terrain
lilleyse Jan 6, 2023
cedafe7
Merge branch 'main' into 3d-tiles-terrain
ggetz Aug 21, 2023
538fd35
Merge branch 'main' into 3d-tiles-terrain
ggetz Apr 15, 2024
8ad5fd9
Merge branch 'main' into 3d-tiles-terrain
ggetz Aug 22, 2024
e1be5f9
Draft
ggetz Aug 26, 2024
0bc0b2b
Merge branch 'main' into 3d-tiles-terrain
ggetz Sep 12, 2024
40f8736
Merge branch '3d-tiles-terrain' into 3d-tiles-terrain-watermask
ggetz Sep 12, 2024
9bac174
WaterMasks for 3D Tiles Terrain
ggetz Sep 17, 2024
2b990bf
Fix normals
ggetz Sep 17, 2024
6dbc922
Fix ts-build errors
ggetz Sep 17, 2024
9c2f2f7
Fix build-docs
ggetz Sep 17, 2024
f7d9d17
Fix merge conflict
ggetz Sep 18, 2024
97f53e0
Fix specs
ggetz Sep 18, 2024
33a8f3e
Merge pull request #12205 from CesiumGS/3d-tiles-terrain-watermask
ggetz Sep 18, 2024
61fbc02
Bug fixes
lilleyse Oct 30, 2024
b5c1b76
Merge branch 'main' into 3d-tiles-terrain
lilleyse Oct 31, 2024
74d31b2
Merge branch 'main' into 3d-tiles-terrain
Feb 10, 2025
c60a29b
Re-run prettier
Feb 10, 2025
a0e2657
Fix spurious merge changes
Feb 10, 2025
9a8a070
Merge branch 'main' into 3d-tiles-terrain
Mar 12, 2025
3407e68
Merge branch 'main' into 3d-tiles-terrain
Mar 18, 2025
a853218
Remove calls to deprecated defaultValue
Mar 18, 2025
11d846a
Merge branch 'main' into 3d-tiles-terrain
Apr 4, 2025
43991b4
Merge branch 'main' into 3d-tiles-terrain
May 1, 2025
7b7636f
Merge branch 'main' into 3d-tiles-terrain
Jun 9, 2025
77aba4f
Merge branch 'main' into 3d-tiles-terrain
Jul 1, 2025
9550c39
Merge branch 'main' into 3d-tiles-terrain
Oct 9, 2025
639ea45
Clean up docstrings and types
Oct 10, 2025
c2f5433
Fix Cesium3DTilesTerrainProviderSpec
Oct 10, 2025
e0eadb4
Fix ImplicitSubtreeSpec
Oct 10, 2025
ba486ca
Revert signatures in TerrainEncodingSpec
Oct 10, 2025
bc97809
Merge branch 'terrain-docs' into 3d-tiles-terrain
Oct 15, 2025
0ed8a62
Update 3d tiles terrain sandcastle
Oct 16, 2025
62b5da4
Merge branch 'main' into 3d-tiles-terrain
Oct 16, 2025
470fbdd
Clean up types in 3d tiles terrain processing
Oct 17, 2025
2afb7b6
Clean up, clarify docs in Cesium3DTilesTerrain classes
Oct 21, 2025
d31a0c3
Fix destructuring in Cesium3DTilesTerrainGeometryProcessor
Oct 21, 2025
c202463
Use async/await in Cesium3DTilesTerrainDataSpec
Oct 22, 2025
e944a82
Minor cleanup in Cesium3DTilesTerrainProvider
Oct 23, 2025
77fb377
Avoid recomputing keys in ResourceCache
Oct 23, 2025
668b8bb
Update CHANGES.md, clean up whitespace
Oct 23, 2025
2de6dd7
Merge branch 'main' into 3d-tiles-terrain
Oct 23, 2025
d08ce7a
Move constructors to tops of files
Oct 23, 2025
61f8dcf
Clear TODO comments in Cesium3DTilesTerrainGeometryProcessor
Oct 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions Apps/Sandcastle/gallery/Globe Materials – 3D Tiles Terrain.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
/>
<meta name="description" content="Apply materials to the globe." />
<meta name="cesium-sandcastle-labels" content="Showcases" />
<title>Cesium Demo</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script
type="text/javascript"
src="../../../Build/CesiumUnminified/Cesium.js"
nomodule
></script>
<script type="module" src="../load-cesium-es6.js"></script>
</head>
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">
<style>
@import url(../templates/bucket.css);
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar">
<div id="zoomButtons"></div>
</div>
<script id="cesium_sandcastle_script">
window.startup = async function (Cesium) {
"use strict";
//Sandcastle_Begin
const terrainProvider = await Cesium.Cesium3DTilesTerrainProvider.fromIonAssetId(
3923568,
{
requestVertexNormals: true, // Needed for hillshade lighting
requestWaterMask: true, // Needed to distinguish land from water
},
);

const viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: terrainProvider,
scene3DOnly: true,
sceneModePicker: false,
navigationHelpButton: false,
});

// Create a globe material for shading elevation only on land
const customElevationMaterial = new Cesium.Material({
fabric: {
type: "ElevationLand",
materials: {
waterMaskMaterial: {
type: "WaterMask",
},
elevationRampMaterial: {
type: "ElevationRamp",
},
},
components: {
diffuse: "elevationRampMaterial.diffuse",
alpha: "1.0 - waterMaskMaterial.alpha", // We'll need the inverse of the watermask to shade land
},
},
translucent: false,
});

const minHeight = -414.0; // approximate dead sea elevation
const maxHeight = 8777.0; // approximate everest elevation
const elevationRamp = [0.0, 0.045, 0.45, 0.5, 0.55, 1.0];
function getColorRamp() {
const ramp = document.createElement("canvas");
ramp.width = 100;
ramp.height = 1;
const ctx = ramp.getContext("2d");

const values = elevationRamp;

const grd = ctx.createLinearGradient(0, 0, 100, 0);

// See https://gis.stackexchange.com/questions/25099/choosing-colour-ramp-to-use-for-elevation
grd.addColorStop(values[0], "#344f31");
grd.addColorStop(values[1], "#5b8742");
grd.addColorStop(values[2], "#e6daa5");
grd.addColorStop(values[3], "#fdc771");
grd.addColorStop(values[4], "#b99d89");
grd.addColorStop(values[5], "#f0f0f0");

ctx.fillStyle = grd;
ctx.fillRect(0, 0, 100, 1);

return ramp;
}

const globe = viewer.scene.globe;
const material = customElevationMaterial;
const shadingUniforms = material.materials.elevationRampMaterial.uniforms;

globe.showWaterEffect = false;
globe.enableLighting = true;

shadingUniforms.minimumHeight = minHeight;
shadingUniforms.maximumHeight = maxHeight;
shadingUniforms.image = getColorRamp();
globe.material = material;

// Light the scene with a hillshade effect similar to https://pro.arcgis.com/en/pro-app/latest/tool-reference/3d-analyst/how-hillshade-works.htm
const scene = viewer.scene;
scene.light = new Cesium.DirectionalLight({
direction: new Cesium.Cartesian3(1, 0, 0), // Updated every frame
});

// Update the light position base on the camera
const scratchNormal = new Cesium.Cartesian3();
scene.preRender.addEventListener(function (scene, time) {
const surfaceNormal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(
scene.camera.positionWC,
scratchNormal,
);
const negativeNormal = Cesium.Cartesian3.negate(surfaceNormal, surfaceNormal);
scene.light.direction = Cesium.Cartesian3.normalize(
Cesium.Cartesian3.add(negativeNormal, scene.camera.rightWC, surfaceNormal),
scene.light.direction,
);
});
//Sandcastle_End
};
if (typeof Cesium !== "undefined") {
window.startupCalled = true;
window.startup(Cesium).catch((error) => {
"use strict";
console.error(error);
});
Sandcastle.finishedLoading();
}
</script>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#### Additions :tada:

- Added experimental support for loading 3D Tiles as terrain, via `Cesium3DTilesTerrainProvider`. See [the PR](https://github.com/CesiumGS/cesium/pull/12963) for limitations on the types of 3D Tiles that can be used. [#12296](https://github.com/CesiumGS/cesium/issues/12296)
- Added support for [EXT_mesh_primitive_edge_visibility](https://github.com/KhronosGroup/glTF/pull/2479) glTF extension. [#12765](https://github.com/CesiumGS/cesium/issues/12765)

#### Fixes :wrench:
Expand Down
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/0/0/0/0.glb
Binary file not shown.
Binary file not shown.
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/0/1/0/0.glb
Binary file not shown.
Binary file not shown.
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/0/1/1/0.glb
Binary file not shown.
Binary file not shown.
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/1/0/0/0.glb
Binary file not shown.
Binary file not shown.
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/1/1/0/0.glb
Binary file not shown.
Binary file added Specs/Data/Cesium3DTiles/Terrain/Test/1/1/0/1.glb
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions Specs/Data/Cesium3DTiles/Terrain/Test/tileset.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"asset":{"version":"1.1"},"geometricError":631380.3810809468,"metadata":{"class":"tilesetInfo","properties":{"description":"Entire Earth description","name":"Entire Earth"}},"root":{"boundingVolume":{"region":[-3.141592653589793,-1.5707963267948966,3.141592653589793,1.5707963267948966,-130.93199157714844,80.01030731201172]},"children":[{"boundingVolume":{"region":[-3.141592653589793,-1.5707963267948966,0.0,1.5707963267948966,-76.75321197509766,67.20038604736328]},"content":{"uri":"0/{level}/{x}/{y}.glb"},"geometricError":157845.0952702367,"implicitTiling":{"availableLevels":2,"subdivisionScheme":"QUADTREE","subtreeLevels":7,"subtrees":{"uri":"0/{level}/{x}/{y}.subtree"}}},{"boundingVolume":{"region":[0.0,-1.5707963267948966,3.141592653589793,1.5707963267948966,-130.93199157714844,80.01030731201172]},"content":{"uri":"1/{level}/{x}/{y}.glb"},"geometricError":157845.0952702367,"implicitTiling":{"availableLevels":2,"subdivisionScheme":"QUADTREE","subtreeLevels":7,"subtrees":{"uri":"1/{level}/{x}/{y}.subtree"}}}],"geometricError":315690.1905404734,"refine":"REPLACE"},"schema":{"classes":{"subtreeTile":{"properties":{"boundingSphere":{"array":true,"componentType":"FLOAT64","count":4,"semantic":"TILE_BOUNDING_SPHERE","type":"SCALAR"},"horizonOcclusionPoint":{"componentType":"FLOAT64","semantic":"TILE_HORIZON_OCCLUSION_POINT","type":"VEC3"},"maximumHeight":{"componentType":"FLOAT64","semantic":"TILE_MAXIMUM_HEIGHT","type":"SCALAR"},"minimumHeight":{"componentType":"FLOAT64","semantic":"TILE_MINIMUM_HEIGHT","type":"SCALAR"}}},"tilesetInfo":{"properties":{"description":{"semantic":"DESCRIPTION","type":"STRING"},"name":{"semantic":"NAME","type":"STRING"}}}}}}
Loading