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,谢谢。

posted @ 2025-04-02 14:31  邢韬  阅读(279)  评论(0)    收藏  举报