cesium Primitive 大量水面 淹没效果
时间: 2023-11-11 08:02:29 浏览: 144
要实现大量水面淹没效果,您可以使用Cesium中的ClippingPlaneCollection和Primitive组合来实现。以下是一个示例代码:
```javascript
// 创建PrimitiveCollection和ClippingPlaneCollection对象
var primitives = new Cesium.PrimitiveCollection();
var clippingPlanes = new Cesium.ClippingPlaneCollection({
planes : []
});
// 将PrimitiveCollection添加到场景中
viewer.scene.primitives.add(primitives);
// 加载GeoJSON数据
Cesium.GeoJsonDataSource.load('./data.geojson').then(function(dataSource) {
var entities = dataSource.entities.values;
var height = 0.0;
// 循环遍历每个实体并设置面样式
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
// 如果是水面实体,将其添加到ClippingPlaneCollection中
if (entity.properties.type == "water") {
var plane = new Cesium.Plane(Cesium.Cartesian3.UNIT_Z, -entity.properties.height);
clippingPlanes.add(plane);
height = height + entity.properties.height;
}
// 如果是陆地实体,将其添加到PrimitiveCollection中
else {
var primitive = new Cesium.Primitive({
geometryInstances : new Cesium.GeometryInstance({
geometry : new Cesium.PolygonGeometry({
polygonHierarchy : new Cesium.PolygonHierarchy(entity.polygon),
height : entity.properties.height,
extrudedHeight : entity.properties.extrudedHeight,
vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL,
stRotation: entity.properties.stRotation
}),
attributes : {
color : Cesium.ColorGeometryInstanceAttribute.fromColor(entity.properties.color)
}
}),
appearance : new Cesium.PerInstanceColorAppearance({
closed : true
})
});
primitives.add(primitive);
}
}
// 设置ClippingPlaneCollection
viewer.scene.globe.clippingPlanes = clippingPlanes;
viewer.scene.globe.depthTestAgainstTerrain = true;
viewer.camera.setView({
destination : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, height + 1000),
orientation : {
heading : 0.0,
pitch : Cesium.Math.toRadians(-90.0),
roll : 0.0
}
});
});
```
其中,我们首先创建一个PrimitiveCollection和ClippingPlaneCollection对象来分别存储陆地和水面实体。然后,我们遍历每个实体,如果是水面实体,则将其高度作为一个ClippingPlane添加到ClippingPlaneCollection中。如果是陆地实体,则将其作为一个Primitive添加到PrimitiveCollection中。最后,我们将ClippingPlaneCollection设置到场景的globe中,这样就可以实现水面淹没效果了。
需要注意的是,由于大量水面的存在,可能会导致渲染性能下降。因此,建议使用WebGL调试工具来优化代码和性能。
阅读全文