行业知识
cesium相机视角跳转和缩放至entity方法汇总
2026-11-01 04:08:14
来源:互联网转载
下面汇总的相机视角跳转方法有很多种,都是根据某一个经纬度高程坐标[x,y,z],Entity实体或者矩形四至范围[west , south , east , north]作为视图跳转到目标范围的中心,然后在该位置上设置相机相对的偏移量,这个偏移量主要是设置相机的偏航角、航向角和翻滚角或者椭球范围,请大家根据实际情况选择合适的相机视角跳转方法 。以下方法都不适合一般的运动轨迹视角跟随。
viewer.trackedEntity =entity //注意,这个方法一般用于动画轨迹视图跟踪。此时视图可以旋转缩放,不能平移,因为实体对象会一直保持在当前视图中心。在一些极端情况下会出些一些bug,比如缩放到距离实体很近的时候,实体运动会拖影卡顿,并且可以平移地图使得实体移除到视图之外,建议在远距离跟踪的时候使用该方法。
import * as Cesium from "cesium";/** * 相机移动到某一个坐标或者矩形范围内 * @param {Cesium.Viewer} viewer -地图对象 * @param {Object} option -参数对象 * @param {Number} option.duration -视图跳转时间(单位/s) * @param {String} option.type -跳转目标类型方式,‘point’:相机移动到某一个坐标;‘rectangle’:相机移动到矩形范围内 * @param {Array} option.xyz -跳转目标类型方式:‘point’,则xyz为[x,y,z] * @param {Array} option.wsen -跳转目标类型方式:‘rectangle’,则wsen为[west , south , east , north],(单位/度) * @param {Number} option.heading -相机航向角 * @param {Number} option.pitch -相机俯仰角 * @param {Number} option.roll -相机翻滚角 */export function cameraFlyTo(viewer, option) { let destination; if ((option.type = "point")) { destination = Cesium.Cartesian3.fromDegrees(...option.xyz); } else if ((option.type = "rectangle")) { destination = Cesium.Cartesian3.fromDegrees(...option.ewsn); } viewer.camera.flyTo({ duration: option.duration, destination, orientation: { heading: Cesium.Math.toRadians(option.heading), pitch: Cesium.Math.toRadians(option.pitch), roll: option.roll, }, });}/** * 相机移动到某一坐标点上,可以用于视角跟踪实体对象,但是视角是固定的, * 适合视角跟随的情况:实时运动轨迹,可以获取前后两个点,实时计算偏北角(航向角) * @param {Cesium.Viewer} viewer -地图对象 * @param {Object} option -参数对象 * @param {Array} option.xyz -跳转椭球体中心坐标数组[x,y,z] * @param {Number} option.heading -相机航向角 * @param {Number} option.pitch -相机俯仰角 * @param {Number} option.range -以椭球体中心坐标为中心的的范围大小(单位/m) */export function cameraLookAt(viewer, option) { viewer.camera.lookAt( Cesium.Cartesian3.fromDegrees(...option.xyz), new Cesium.HeadingPitchRange( Cesium.Math.toRadians(option.heading), Cesium.Math.toRadians(option.pitch), option.range ) );}/** * 相机移动到某一坐标点上,不可用于视角跟踪实体对象 * @param {Cesium.Viewer} viewer -地图对象 * @param {Object} option -参数对象 * @param {Array} option.xyz -跳转椭球体中心坐标数组[x,y,z] * @param {Number} option.duration -视图跳转时间(单位/s) * @param {Number} option.heading -相机航向角 * @param {Number} option.pitch -相机俯仰角 * @param {Number} option.roll -相机翻滚角 */export function cameraSetView(viewer, option) { viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(...option.xyz), orientation: { heading: Cesium.Math.toRadians(option.heading), pitch: Cesium.Math.toRadians(option.pitch), roll: option.roll, }, });}/** * 相机视图移动到移到某一个坐标范围内,注意可以用来定位用,不可用于视角跟踪实体对象!!!! * @param {Cesium.Viewer} viewer -地图对象 * @param {Object} option -参数对象 * @param {Array} option.xyz -跳转椭球体中心坐标数组[x,y,z] * @param {Number} option.radius -跳转椭球体半径(单位/m) * @param {Number} option.duration -视图跳转时间(单位/s) * @param {Number} option.heading -相机航向角 * @param {Number} option.pitch -相机俯仰角 * @param {Number} option.range -以跳转坐标为中心的的范围大小(单位/m) */export function cameraflyToBoundingSphere(viewer, option) { viewer.camera.flyToBoundingSphere( new Cesium.BoundingSphere( Cesium.Cartesian3.fromDegrees(...option.xyz), option.radius ), { duration: option.duration, offset: { heading: Cesium.Math.toRadians(option.heading), pitch: Cesium.Math.toRadians(option.pitch), range: option.range, }, complete: function () { console.log("飞行完成!"); }, cancel: function () { console.log("飞行取消!"); }, } );}/** * 相机移动到某一entity实体上 === viewer.zoomTo(entity),不可用于视角跟踪实体对象 * @param {Cesium.Viewer} viewer -地图对象 * @param {Object} option -参数对象 * @param {Object} option.target -target可以是单个或者多个entity对象,以及各自cesium支持的图层,不能是坐标 * @param {Number} option.duration -视图跳转时间(单位/s) * @param {Number} option.heading -相机航向角 * @param {Number} option.pitch -相机俯仰角 * @param {Number} option.range -以entity为中心的的范围大小(单位/m) */export function viewerFlyTo(viewer, option) { viewer.flyTo(option.target, { duration: option.duration, offset: { heading: Cesium.Math.toRadians(option.heading), pitch: Cesium.Math.toRadians(option.pitch), range: option.range, }, // 视角跳转最大高度(一般不用) // maximumHeight: 20000, });} ()()
上一篇:服务器系统怎么调试?
下一篇:怎么强制重启PC服务器?