SampledPositionProperty
最近在做無人機實時軌跡,開始用定時器setTimeOut每秒獲取無人機的位置并修改模型位置,但是由于無人機飛行速度比較快,導致可視化的軌跡效果不夠平滑,有點鬼畜。
試過了CZML,但是無法很好實時添加軌跡點位,且由于不夠靈活,姿態(tài)等屬性也無法調整,CZML參見:http://www.rzrgm.cn/xt112233/p/17035616.html
于是查看通過CZML生成的Entity,發(fā)現生成的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號