Cesium 追踪模型或entity 动态修改观看视角

先晒一下效果:

先说下大致实现的情形:

现从后台获取json数据,拿到gps坐标数组,里面包含时间和经纬度高度,展示模型的运行轨迹,并且在展示的同时可以动态修改观看的视角;

以下是cesium中trackEntity时的视角设定:

调用viewFrom方法;

在entity这个类下,自己可以去看一下,这里的设定只是在追踪entity的时候初始视角,下面的是动态修改视角;

现说下大致的实现思路:

1、获取数据时 设置 var property = new Cesium.SampledPositionProperty();

2、将获取到的property添加到entity中,

viewer.entities.add({
                    availability: new Cesium.TimeIntervalCollection([new         
                    Cesium.TimeInterval({
                        start: start,
                        stop: stop
                    })]),
                    position: property,
                    orientation: new Cesium.VelocityOrientationProperty(property),
                    model: {
                        uri: '../data/gltf/plane.glb',
                        minimumPixelSize: 64
                    },
                    path: {
                        resolution: 1,
                        material: new Cesium.PolylineGlowMaterialProperty({
                            glowPower: 0.1,
                            color: Cesium.Color.YELLOW.withAlpha(0)
                        }),
                        width: 3
                    }
                });

3、以上两步即可使模型运动,接下来动态设置视角,我是使用Cesium.knockout.track(viewModel);绑定了一个html的控制面板,当然不用这个自己写也行,绑定好了之后添加场景的渲染事件viewer.scene.preUpdate.addEventListener,在此事件的回调函数里动态修改camera的hpr;

 preUpdateHandler = viewer.scene.preUpdate.addEventListener(function () {
                if (entity) {
                    hpRange.heading = viewHeading || Cesium.Math.toRadians(90);
                    hpRange.pitch = viewPitch || Cesium.Math.toRadians(0);
                    hpRange.range = viewRange || 1000;
                    var center = entity.position.getValue(viewer.clock.currentTime);
                    if (center) viewer.camera.lookAt(center, hpRange);
                }
            });

以上三步即可完成全部的功能;

谢谢观看!如有问题请留言或者私信我!

### 如何在 Cesium 中实现航迹飞行动画 #### 航迹飞行的核心概念 Cesium 提供了 `SampledPositionProperty` 和时间轴(Timeline)来支持轨迹回放功能。通过设置实体的位置属性为 `SampledPositionProperty`,可以记录一系列的时间-位置数据点,并利用这些数据点创建动态的运动效果[^1]。 以下是具体实现方法: --- #### 初始化 Cesium Viewer 首先需要初始化一个 Cesium 的 `Viewer` 对象。为了使动画自动播放,可以通过参数 `shouldAnimate: true` 启用内置动画机制[^2]。 ```javascript const viewer = new Cesium.Viewer("cesiumContainer", { shouldAnimate: true, }); ``` --- #### 创建带有 SampledPositionProperty实体 使用 `SampledPositionProperty` 来定义物体随时间变化的位置。下面是一个简单的例子,展示如何向实体添加采样位置并启动动画: ```javascript // 定义一个实体用于表示移动对象 let entity = viewer.entities.add({ position: new Cesium.SampledPositionProperty(), model: { uri: "./path/to/model.glb", scale: 0.5, }, path: { show: true, // 显示路径 width: 3, material: new Cesium.PolylineGlowMaterialProperty({ glowPower: 0.8, color: Cesium.Color.YELLOW, }), }, }); // 获取当前时间作为起点 let startTime = Cesium.JulianDate.now(); // 添加多个样本点到 SampledPositionProperty entity.position.addSample(startTime, Cesium.Cartesian3.fromDegrees(-115.0, 37.0, 3000)); entity.position.addSample( Cesium.JulianDate.addSeconds(startTime, 10, new Cesium.JulianDate()), Cesium.Cartesian3.fromDegrees(-114.9, 37.1, 3000) ); entity.position.addSample( Cesium.JulianDate.addSeconds(startTime, 20, new Cesium.JulianDate()), Cesium.Cartesian3.fromDegrees(-114.8, 37.2, 3000) ); // 设置时间范围以便于观察整个轨迹 viewer.clock.startTime = startTime; viewer.clock.stopTime = Cesium.JulianDate.addSeconds(startTime, 20, new Cesium.JulianDate()); viewer.timeline.zoomTo(viewer.clock.startTime, viewer.clock.stopTime); ``` 上述代码片段展示了如何构建一条由三个坐标组成的简单轨迹,并将其绑定至模型上。随着时间推移,模型会沿着指定路线移动。 --- #### 配置跟随视角上帝视角 如果希望相机始终跟踪目标,则可启用跟随模式;反之则保持固定视图以俯瞰全局。 ##### **跟随视角** 让摄像机锁定在活动实体周围旋转: ```javascript viewer.trackedEntity = entity; // 自动追踪实体 ``` ##### **上帝视角** 禁用默认追踪行为后手动调整镜头高度: ```javascript viewer.camera.flyToBoundingSphere(Cesium.BoundingSphere.fromRectangle3D( Cesium.Rectangle.fromDegrees(-115.0, 36.9, -114.7, 37.3), new Cesium.HeadingPitchRange(0, -Math.PI / 4, 1000000) ), { duration: 0 }); ``` 此操作允许用户从高空鸟瞰整条航线而不受任何干扰[^3]。 --- #### 示例总结 以上介绍了基于 Cesium 平台开发轨迹飞行动画的基础流程——即借助 `SampledPositionProperty` 记录时空序列并通过 Timeline 控制其展现节奏。最终成品不仅能够呈现逼真的三维漫游体验,还具备灵活定制选项满足不同需求场景下的应用扩展可能性。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值