Slide 12
Slide 12 text
Map views and clipping 3D Tiles at runtime
3D Clipping using
Cesium.ClippingPlane
const outerRingCoordinates = uniqBy(union ? coordinates : coordinates.reverse(), (coords)
=> `${coords[0]}${coords[1]}`);
const points = outerRingCoordinates.map(([lng, lat, height = 0]) => {
const point = Cesium.Cartesian3.fromDegrees(lng, lat, height);
return point;
});
const pointsLength = points.length;
// Create center points for each clipping plane
const clippingPlanes = [];
for (let i = 0; i < pointsLength; ++i) {
const nextIndex = (i + 1) % pointsLength;
let midpoint = Cesium.Cartesian3.add(points[i], points[nextIndex],
new Cesium.Cartesian3());
midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint);
const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3());
let right = Cesium.Cartesian3.subtract(points[nextIndex], midpoint,
new Cesium.Cartesian3());
right = Cesium.Cartesian3.normalize(right, right);
let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3());
normal = Cesium.Cartesian3.normalize(normal, normal);
// Compute distance by pretending the plane is at the origin
const originCenteredPlane = new Cesium.Plane(normal, 0.0);
const distance = Cesium.Plane.getPointDistance(originCenteredPlane, midpoint);
clippingPlanes.push(new Cesium.ClippingPlane(normal, distance));
}
1. Municipality of Genoa - Mapstore showing a clipped 3D Tiles to highlight a subway station inside the
CesiumJS viewer
2. https://github.com/geosolutions-it/MapStore2/blob/2025.01.xx/web/client/utils/cesium/PrimitivesUtils.js