SampledPositionProperty
最近在做无人机实时轨迹,开始用定时器setTimeOut每秒获取无人机的位置并修改模型位置,但是由于无人机飞行速度比较快,导致可视化的轨迹效果不够平滑,有点鬼畜。
试过了CZML,但是无法很好实时添加轨迹点位,且由于不够灵活,姿态等属性也无法调整,CZML参见:https://www.cnblogs.com/xt112233/p/17035616.html
于是查看通过CZML生成的Entity,发现生成的Entity采用了SampledPositionProperty来控制模型的轨迹。
SampledPositionProperty可以通过Cesium中内置的时间来控制返回值,使用addSample方法设置时间和点位,会根据当前Cesium中的时间通过插值自动计算当前位置。

代码如下:
let position = new SampledPositionProperty(); // 计算时间去,起始时间为当前,结束时间为10秒后 let time1 = JulianDate.now(); let time2 = Cesium.JulianDate.addSeconds(time1 , 10, new Cesium.JulianDate()); // 添加位置 let c31 = Cesium.Cartesian3.fromDegrees(120.3321766, 36.2241208, 35); let c32 = Cesium.Cartesian3.fromDegrees(120.3339342, 36.2165777, 25); position.addSample(time1 , c31); position.addSample(time2 , c32);

需要注意的是,SampledPositionProperty是通过其getValue方法获得当前时间的位置,在运动到时间末尾会返回undefined导致实体消失。

所以有必要可以对其方法进行简单的修改,使其在超出范围后保持原位。
export default class ExtendSampledPositionProperty extends SampledPositionProperty { lastPosition: undefined | Cartesian3; constructor( referenceFrame = ReferenceFrame.FIXED, numberOfDerivatives = 0 ) { super(referenceFrame, numberOfDerivatives); this.lastPosition = undefined; } /** * @description: 解决getValue返回undefined导致entity获取不到坐标消失问题 * @param {JulianDate} time * @param {*} result * @return {*} */ getValue(time: JulianDate, result = new Cartesian3()) { let p = this.getValueInReferenceFrame( time, ReferenceFrame.FIXED, result ); if (p) { this.lastPosition = p.clone(); return p; } else { return this.lastPosition; } } }
需要注意的是,由于和Cesium中的时钟Clock挂钩,所以只有在shouldAnimate为true的时候才会运动,multiplier亦可以控制其运动速度。
感兴趣的朋友可以移步:LiZzhi/cesium-dev-set,如果对您有帮助,请给我一颗star,谢谢。

浙公网安备 33010602011771号