项目需要根据传递下一个位置的坐标来使模型产生移动平滑的效果。
使用 CallbackProperty 能使模型移动,其效果是模型会一闪一闪的,不能有平滑的效果。除非websocket传递的时间间隔很快,坐标移动的距离很短。就可以使用CallbackProperty。
这里我们使用SampledPositionProperty 产生动画效果。并使用lerp方法对2个坐标点之间进行插值。这里需要注意的是与时间相关的动画效果,都需要开启viewer.clock.shouldAnimate才能产生效果。
平滑效果代码如下:
updataPositon: function (snInfo,entity) {
viewer.clock.shouldAnimate = true;
let positionsOld = Cesium.Cartesian3.fromDegrees(snInfo.old.lon, snInfo.old.lat, snInfo.old.height);
let positionsNew = Cesium.Cartesian3.fromDegrees(snInfo.new.lon, snInfo.new.lat, snInfo.new.height);
var start = Cesium.JulianDate.fromDate(new Date());
let numberOfSamples = 100;
let totalSeconds = 2.00; //动画时间执行完毕
const positions = new Cesium.SampledPositionProperty();
for (let i = 0; i <= numberOfSamples; ++i) {
const factor = i / numberOfSamples;
const time = Cesium.JulianDate.addSeconds(
start,
factor * totalSeconds,
new Cesium.JulianDate()
);
const locationFactor = Math.pow(factor, 2);
const location = Cesium.Cartesian3.lerp(
positionsOld, //传递的上一个坐标
positionsNew, //传递的下一个坐标
locationFactor,
new Cesium.Cartesian3()
);
positions.addSample(time, location);
}
entity.position = positions; //最后更新entity实体的坐标位置
}
由于我的实时传递的时间间隔为2秒。所以我的模型从这个位置移动到下一个位置的时间也是2秒。这样当这个动画执行完毕以后又有新的参数传进来,便可以做到平滑且连贯。
实际上模型从这个位置移动到下个位置需要2秒,所以模型当前的位置是与真实的位置是慢了2秒的。
下一节将讲述 姿态平滑的效果。姿态平滑的方法及步骤与移动平滑如出一辙,但cesium插值语法只能对坐标之间进行插值。所以下一节将写个对数值进行插值,来实现姿态平滑的效果。