cesiumjs 实现3dtiles局部多边形压平
时间: 2023-09-14 17:14:58 浏览: 287
cesium关于3dtiles
要在 Cesium 中将一个局部多边形压平,可以使用地形提取工具(TerrainProvider)和高程调整工具(ElevationSampler)。具体步骤如下:
1. 创建一个局部多边形的 Entity 对象,并将其添加到场景中。
2. 获取该 Entity 对象的位置、高度和边界框信息。
3. 创建一个地形提取工具(例如 CesiumTerrainProvider),并设置其参数,例如数据源和最大 LOD 等级。
4. 创建一个高程调整工具(例如 QuantizedMeshTerrainData),并设置其参数,例如局部多边形的位置和边界框信息。
5. 将地形提取工具和高程调整工具绑定起来,生成一个压平后的局部多边形模型(例如 QuantizedMesh)。
6. 将压平后的局部多边形模型添加到场景中,并删除原来的局部多边形 Entity 对象。
下面是一个示例代码:
```
var polygonEntity = viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
-72.0, 40.0,
-70.0, 35.0,
-75.0, 30.0,
-70.0, 30.0,
-68.0, 40.0
]),
height: 0,
material: Cesium.Color.RED.withAlpha(0.5)
}
});
var position = polygonEntity.position.getValue(viewer.clock.currentTime);
var height = polygonEntity.polygon.height.getValue(viewer.clock.currentTime);
var boundingBox = Cesium.Entity.computeBoundingBox(polygonEntity, viewer.clock.currentTime);
var min = boundingBox.minimum;
var max = boundingBox.maximum;
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles'
});
var elevationSampler = new Cesium.ElevationSampler(terrainProvider);
elevationSampler.setSamplingOptions({
extent: Cesium.Rectangle.fromDegrees(min.x, min.y, max.x, max.y)
});
var vertices = [];
var indices = [];
var vertexCount = 0;
for (var i = 0; i < polygonEntity.polygon.hierarchy.getValue().positions.length; i++) {
var position = polygonEntity.polygon.hierarchy.getValue().positions[i];
var cartographic = Cesium.Cartographic.fromCartesian(position);
var elevation = elevationSampler.sampleHeight(cartographic);
vertices.push(position.x, position.y, elevation);
vertexCount++;
}
var mesh = new Cesium.QuantizedMesh({
vertices: new Uint16Array(vertices),
indices: new Uint16Array(indices),
boundingSphere: Cesium.BoundingSphere.fromVertices(vertices)
});
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);
var model = viewer.scene.primitives.add(new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: mesh,
modelMatrix: modelMatrix
}),
appearance: new Cesium.MaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: Cesium.Color.RED.withAlpha(0.5)
})
})
}));
viewer.entities.remove(polygonEntity);
```
在这个示例代码中,我们创建了一个红色透明的多边形 Entity 对象,并获取了其位置、高度和边界框信息。然后,我们创建了一个地形提取工具和一个高程调整工具,并使用它们生成了一个压平后的局部多边形模型,并将其添加到场景中。最后,我们删除了原来的多边形 Entity 对象。
阅读全文