Cesium 实战 14 - 飞行视角跟随-第一人称视角漫游

本文介绍了如何在Cesium中实现第一人称视角跟随漫游的功能。作者分享了从寻找官方方法到尝试各种实现方式的过程,最终通过实时监听飞行状态并动态修改视角来达成目标。文章提供了核心代码、完整示例和参考资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cesium 实战 - 飞行视角跟随-第一人称视角漫游

在这里插入图片描述

2023年4月19日更新—搞了一个 Cesium 镜像,欢迎使用:沙盒示例API

作为三维项目,以第一人称视角漫游是比较常见的需求,而 Cesium 默认是不带此功能,因此需要自己实现。

在网上几乎没有发现完整的实现示例,大多都是部分代码或者提供思路,经研究,终于实现功能,这里记录一下。

本文包括实现思路、核心代码以及在线示例三部分。


实现思路

在最开始的时候,作者以为官方会有类似于 viewer.trackedEntity = entity; 的方法来实现第一人称视角,结果找半天并没有发现。

后来,想的是通过 viewer.camera.setViewviewer.camera.lookAtTransform 之类的方式实现,结果尝试很多次并没有成功。

viewer.camera.lookAtTransform 也可以实现固定视角,但是

### Cesium 中实现第三人称跟随视角漫游效果 为了实现在 Cesium 中创建第三人称跟随相机的效果,可以利用 `Viewer` 对象中的 `camera` 属性来控制摄像机的位置和方向。通过监听实体位置的变化并相应调整摄像机的角度和距离,能够模拟出跟随后方的视觉体验。 下面是一个简单的例子,展示了如何设置一个基本的第三视角跟随功能: ```javascript // 初始化 Cesium Viewer 实例 const viewer = new Cesium.Viewer('cesiumContainer'); // 创建一个飞行器模型作为被跟踪对象 viewer.entities.add({ position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), model : { uri : 'path/to/your/model.glb' } }); let targetEntity; function setTarget(entity) { targetEntity = entity; } setTarget(viewer.entities.values[0]); // 设置初始相机位置到目标后面一定距离处 function updateCamera() { const offset = new Cesium.HeadPitchRoll(0, Cesium.Math.toRadians(-15), 0); if (Cesium.defined(targetEntity)) { let pos = Cesium.Property.getValueOrClamped(targetEntity.position, viewer.clock.currentTime); // 计算相对于物体的新相机位置 const transform = Cesium.Transforms.eastNorthUpToFixedFrame(pos); const offsetCartesian = Cesium.Matrix4.multiplyByPointAsVector(transform, new Cesium.Cartesian3(0, -200, 100), new Cesium.Cartesian3()); const finalPos = Cesium.Cartographic.fromCartesian(Cesium.Cartesian3.add(pos, offsetCartesian, new Cesium.Cartesian3())); viewer.camera.setView({ destination : Cesium.Cartesian3.fromRadians(finalPos.longitude, finalPos.latitude, finalPos.height), orientation : { heading : Cesium.Math.PI, pitch : Cesium.Math.toRadians(-15), roll : 0 } }); } requestAnimationFrame(updateCamera); // 持续更新以保持跟随状态 } updateCamera(); ``` 此代码片段定义了一个名为 `updateCamera()` 的函数,它会持续计算新的相机视图,并将其应用给当前场景中的摄像机。这里假设有一个已经存在的实体(比如上面提到的飞行器),该实体具有随时间变化的位置属性。每当调用这个方法时,都会重新评估目标实体的位置,并据此调整摄像机的方向和高度[^1]。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非科班Java出身GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值