cesium实现动态扩散墙效果(基于turf)


Cesium实战系列文章总目录传送门

1.实现效果

在这里插入图片描述

2.实现方法

通过查询Cesium文档,发现并没有提供缩放要素的功能,这里使用第三方库turf来实现。

2.1 turf库

turf做为前端地理空间分析库,在前端开发中广泛应用,网址为:turf中文网
在这里插入图片描述
turf中提供了按比例缩放要素的方法transformScale传送门
在这里插入图片描述

2.2具体代码

这里将缩放代码整合到函数wallDiffuse中,可以实现墙的放大和缩小,缩放比例应该大于0,0-1之前为缩小,大于1为放大。

2.2.1核心函数
/**
 * @description: 扩散墙效果(基于turf实现,可以放到或缩小)
 * @param {*} _positions:底部坐标,单个面坐标的格式为[[[lon,lat]]]
 * @param {*} _scale:最大缩放比例
 * @param {*} _height:墙高度
 * @param {*} _material:墙材质
 * @return {*}
 */
function wallDiffuse(_positions, _scale, _height, _material) {
    let scale = 1;
    this.viewer.entities.add({
        name: "扩散墙",
        wall: {
            positions: new Cesium.CallbackProperty(() => {
                // 判断是放大还是缩小
                if (_scale >= 1) {
                    scale += _scale / 200.0;
                    if (scale >= _scale) {
                        scale = 1.0;
                    }
                } else {
                    scale -= _scale / 200.0;
                    if (scale <= _scale) {
                        scale = 1;
                    }
                }

                let polygon = turf.polygon(_positions);
                let scaledPolygon = turf.transformScale(polygon, scale);
                let newPositions = [];
                // 遍历多边形
                for (let i = 0; i < scaledPolygon.geometry.coordinates[0].length; i++) {
                    // 遍历节点
                    scaledPolygon.geometry.coordinates[0][i].forEach((item) => {
                        newPositions.push(item);
                    })
                    newPositions.push(_height);
                }
                return Cesium.Cartesian3.fromDegreesArrayHeights(newPositions);
            }, false),
            material: _material
        }
    });
}
2.2.2代码调用
// 扩散墙
let wallPositions = [
   [
       [113.8236839, 22.528061],
       [113.9236839, 22.628061],
       [114.0236839, 22.528061],
       [113.9236839, 22.428061],
       [113.8236839, 22.528061],
   ]
];
wallDiffuse(wallPositions, 3.0, 5000.0, new Cesium.Color(1.0, 1.0, 0.0, 0.7));
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现动态河流效果,你可以使用Cesium Material Image这个库来创建一个河流的材质,然后将其应用于Cesium的Primitive对象上。 以下是实现效果的步骤: 1. 创建一个河流的材质 你可以使用Cesium Material Image库中的Cesium.Material.fromType()方法来创建一个河流的材质。以下是一个示例: ```javascript var riverMaterial = Cesium.Material.fromType('Image', { image: 'path/to/river/texture.jpg', repeat: new Cesium.Cartesian2(10.0, 1.0), // 河流纹理的重复次数 color: new Cesium.Color(1.0, 1.0, 1.0, 1.0) // 河流颜色 }); ``` 2. 创建一个Primitive对象 你可以使用Cesium.Primitive库中的Cesium.Primitive.fromGeometry()方法来创建一个Primitive对象。以下是一个示例: ```javascript var geometry = new Cesium.PlaneGeometry({ vertexFormat: Cesium.VertexFormat.POSITION_AND_ST }); var riverPrimitive = new Cesium.Primitive({ geometryInstances: new Cesium.GeometryInstance({ geometry: geometry, attributes: { st: new Cesium.GeometryInstanceAttribute({ componentDatatype: Cesium.ComponentDatatype.FLOAT, componentsPerAttribute: 2, value: new Float32Array([0.0, 0.0, 10.0, 1.0]) // 河流纹理的重复次数 }) }, id: 'river' }), appearance: new Cesium.MaterialAppearance({ material: riverMaterial }) }); ``` 3. 将Primitive对象添加到场景中 你可以使用Cesium的Scene对象中的scene.primitives.add()方法将Primitive对象添加到场景中。以下是一个示例: ```javascript viewer.scene.primitives.add(riverPrimitive); ``` 4. 动态更新河流效果 你可以通过修改Primitive对象的属性来实现动态更新河流效果。例如,你可以通过修改GeometryInstance的st属性来实现纹理的滚动。 ```javascript var riverInstance = riverPrimitive.getGeometryInstanceAttributes('river'); var currentTime = viewer.clock.currentTime; var seconds = currentTime.secondsOfDay; var delta = seconds * 0.01; // 河流滚动速度 var repeat = riverInstance.st.value; repeat.x += delta; repeat.y += delta; riverInstance.st.value = repeat; ``` 注意:以上示例中的代码仅用于说明如何使用Cesium Material Image库实现动态河流效果,并且可能需要根据你的具体应用进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

右弦GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值