首页 / 浏览问题 / WebGIS / 问题详情
模型实时运动
23EXP 2024年03月29日
我需要将模型点位通过entity model 来撒在地图上,然后此时点位是静止的,然后我通过websocket来拿到最新的点位坐标,有什么办法在websocket返回我信息之后我去使这些模型运动到最新的点位上呢?

1个回答

您好,首先 从 WebSocket 收到最新的点位坐标信息后,在前端代码中解析这些坐标数据,获取目标位置。 使用 Cesium 提供的动画或插值方法,实现模型平滑移动到目标点位上;然后通过 SampledPositionProperty 实现了在一秒内模型从当前位置移动到目标位置的效果。你可以根据需要调整动画时间和方式来实现不同的效果

// 假设 targetPosition 是你从 WebSocket 获取到的目标点位坐标
var targetPosition = Cesium.Cartesian3.fromDegrees(10, 0, 0);

// 创建一个动画效果,使模型移动到目标位置
var entity = viewer.entities.getById('yourModelEntityId'); // 根据实际情况获取模型的实体对象
entity.position = new Cesium.ConstantPositionProperty(entity.position.getValue(viewer.clock.currentTime)); // 设置起始位置

var property = new Cesium.SampledPositionProperty();
property.addSample(viewer.clock.currentTime, entity.position.getValue(viewer.clock.currentTime));
property.addSample(viewer.clock.currentTime + 1, targetPosition); // 在1秒内移动到目标位置

entity.position = property;

希望可以帮到您

565EXP 2024年03月29日

property.addSample(viewer.clock.currentTime + 1, targetPosition);
我在循环体里执行这段代码然后上面这行代码会报错,是不能直接+1么,好像会有问题,

我的代码如下:

entities.values.forEach((em: any) => {
          if (em.data.text.includes(item.department + item.devicename)) {
            em.position = new window.Cesium.ConstantPositionProperty(em.position.getValue(earth.viewer.clock.currentTime));
            const property = new window.Cesium.SampledPositionProperty();
            property.addSample(earth.viewer.clock.currentTime, em.position.getValue(earth.viewer.clock.currentTime));
            property.addSample(earth.viewer.clock.currentTime + 1, p);
            em.position = property;
          }
        });

您将代码改为 var newTime = Cesium.JulianDate.addSeconds(earth.viewer.clock.currentTime, 1, new Cesium.JulianDate()); property.addSample(newTime, p);

...