Cesium使用flyToBoundingSphere实现倾斜相机视角观察物体

news/2024/11/8 12:16:42/

之前有一篇文章介绍如何使用Cesium倾斜相机视角观察物体,后面发现了一个API viewer.camera.flyToBoundingSphere,能直接实现我想要的效果。
所以我封装了一个函数,通过使用 Cesium.Camera.flyToBoundingSphere API,自动调整相机的位置和视角,实现相机飞向指定的包围球并观察目标物体的效果。该函数可根据目标的边界自动计算最佳的相机距离,实现便捷的倾斜视角观察。

功能特点

  • 自动计算目标的包围球并调整相机距离
  • 支持自定义相机俯仰角和缩放因子
  • 使用 Promise 异步处理,操作完成后触发回调

参数说明

参数类型默认值必填说明
boundaryArray边界点数组,每两个元素表示一个经纬度坐标
pitchNumber相机俯仰角(以度为单位),用于设置相机观察角度
scaleFactorNumber0.5缩放因子,用于调整目标在视野中的大小

返回值

返回一个 Promise 对象,在相机飞行完成后解析。

示例代码

javascript">// 使用示例
flyToBoundingSphere({boundary:[116.3913, 39.9075, 116.4013, 39.9175], // 北京坐标示例pitch: 45, // 设置俯仰角为45度scaleFactor: 0.7 // 缩小视图中的物体大小
}).then(() => {console.log('相机飞行完成');
}).catch(error => {console.error('相机飞行失败:', error);
});

函数源码

/*** 将相机飞向指定的包围球,并自动调整相机位置和视角。* * @param {Object} options - 配置选项* @param {Array} options.boundary - 边界点数组,每两个元素表示一个经纬度坐标* @param {Number} options.pitch - 相机俯仰角(以度为单位)* @param {Number} [options.scaleFactor=0.5] - 缩放因子,用于调整目标的观察大小* @returns {Promise} - 返回一个Promise对象,在相机飞行完成后解析*/
function flyToBoundingSphere(options) {return new Promise((resolve, reject) => {try {const { boundary, pitch, scaleFactor = 0.5 } = options;const boundingSphere = getBoundingSphere(boundary);// 调整包围球的半径,根据 scaleFactor 放大或缩小视图中的物体大小boundingSphere.radius *= 1 / scaleFactor;// 计算合适的相机高度const distance =boundingSphere.radius / Math.sin(viewer.camera.frustum.fov / 2);// 自动调整相机以确保包围球在视野内viewer.camera.flyToBoundingSphere(boundingSphere, {duration: 2, // 单位秒offset: new Cesium.HeadingPitchRange(Cesium.Math.toRadians(360),Cesium.Math.toRadians(pitch), // 设置相机俯仰角distance, // 计算合适的距离),complete: () => {resolve();},});} catch (e) {reject(e);}});
}/*** 计算包含指定边界点的包围球。** @param {Array} boundary - 边界点数组,每两个元素表示一个经纬度坐标* @returns {Cesium.BoundingSphere} - 包围球对象*/
function getBoundingSphere(boundary) {// 将边界点转换为 Cartesian3 坐标const positions = [];for (let i = 0; i < boundary.length; i += 2) {const lon = boundary[i];const lat = boundary[i + 1];const position = Cesium.Cartesian3.fromDegrees(lon, lat);positions.push(position);}// 计算包含所有边界点的包围球return Cesium.BoundingSphere.fromPoints(positions);
}

http://www.ppmy.cn/news/1545351.html

相关文章

实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标

在当今信息爆炸的时代&#xff0c;自动化数据抓取技术&#xff08;也称为“网络爬虫”&#xff09;对于数据分析与信息挖掘具有重要的作用。本文将介绍如何利用Node.js实现自动化数据抓取&#xff0c;并通过控制鼠标点击与位置坐标的方式&#xff0c;采集页面上指定的新闻数据。…

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

Android 音视频合成经验总结

刚刚实现了音视频合成的需求&#xff0c;趁热打铁记录一下遇到的问题 需求描述&#xff1a; 将给定的音频及视频合成一个视频&#xff0c;如果音频时长小于视频&#xff0c;则重复播放&#xff1b;如果大于视频时长则截取到视频结束。 采用的是MediaMuxer、MediaCodec原生方…

vue3 css的样式如果background没有,如何覆盖有background的样式

在Vue 3中&#xff0c;如果你想要覆盖一个有background样式的元素&#xff0c;你可以使用更具体的CSS选择器来提升你的样式规则的优先级&#xff0c;或者使用!important规则。 .some-class { background: url(path/to/image.jpg) no-repeat center center; } 你可以通过提供一…

linux网络编程自定义协议和多进程多线程并发-TCP编程

1.三次握手及后面过程 计算机A是客户端, B是服务端 1.1三次握手&#xff1a; 1客户端给服务端SYN报文 2服务端返回SYNACK报文 3客户端返回ACK报文 客户端发完ACK后加入到服务端的维护队列中&#xff0c;accept()调用后就能和客户端建立连接&#xff0c;然后建立通讯 1.2关闭…

C++ 线程初始化编译报错

这是一个很简单的开启一个线程, 用于演示一个线程和生命周期之间的错误,但是还没有把这个错误暴露出来, 就遇见了一个编译问题. 线程中执行指定逻辑的代码 线程的执行方法, 声明写在了ThreadRun.h 实现写在 ThreadRun.cpp中. class ThreadRun { public: void func(); };void T…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤&#xff0c;这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口&#xff0c;完全找不到可供参考的例子。如果不需要传递什么参数&#xff0c;就能获取到结果&#xff0c…

特征检测与特征匹配方法笔记+代码分享

在一幅图像中&#xff0c;总能发现其独特的像素点&#xff0c;这些点可以被视为该图像的特征&#xff0c;我们称之为特征点。在计算机视觉领域中&#xff0c;基于特征点的图像特征匹配是一项至关重要的任务&#xff0c;因此&#xff0c;如何定义并识别一幅图像中的特征点显得尤…