当前位置: 首页 > news >正文

Cesium倾斜相机视角观察物体

先看效果:
在这里插入图片描述
在cesium中,我们有时需要倾斜相机视角去观察物体,如相机俯视45观察物体。
cesium的api提供了倾斜相机视角的配置,但是直接使用cesium的api不能达到我们想要的效果。
函数如下:

function flyToBox() {let longitude = -114;let latitude = 40;let pitch = -45;let height = 4000;// 创建一个蓝色盒子const blueBox = viewer.entities.add({name: "Blue box",position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height / 2),box: {dimensions: new Cesium.Cartesian3(1000.0, 1000.0, 1000.0),material: Cesium.Color.BLUE,},});let center = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 相机飞行到指定位置viewer.camera.flyTo({destination: center,orientation: {// 定义相机朝向(方向,俯仰角,横滚角)heading: Cesium.Math.toRadians(360),pitch: Cesium.Math.toRadians(pitch),roll: Cesium.Math.toRadians(0),},duration: 2,});
}

效果如下在这里插入图片描述
可以看到物体已经不在视口范围内了。
why?
原因很简单,我们看到了视野都是相机的视野。
cesium相机默认的角度(picth=-90)如下:
在这里插入图片描述
在这里插入图片描述

当配置了orientation,将相机偏移了-45度,因此物体超出了相机的视野,我们也就看不到物体了。
在这里插入图片描述

想要看到物体也很简单,将相机平移x距离即可。回忆一下高中的知识,在直角三角形中,已知了一个角α和边h,可以求x。即:

x = tanα * h

接下来又是另一个难题。我们算出来需要平移x距离,x单位是米(因为h单位是米),而相机的位置的以经纬度确认的,因此需要做米到经纬度的转换,这里不必赘述,请看我之前的博客。完整代码如下:

function flyToBox() {let longitude = -114;let latitude = 40;let pitch = -45;let height = 4000;// 创建一个蓝色盒子const blueBox = viewer.entities.add({name: "Blue box",position: Cesium.Cartesian3.fromDegrees(longitude, latitude, 0),box: {dimensions: new Cesium.Cartesian3(1000.0, 1000.0, 1000.0),material: Cesium.Color.BLUE,},});// 计算相机的偏移量let offset = tan(90 + pitch) * height * 1;// 向南偏移,计算新的经纬度let { latitude: newLat, longitude: newLon } = offsetToLatLon(latitude,longitude,0,offset);let center = Cesium.Cartesian3.fromDegrees(newLon, newLat, height);//   let center = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 相机飞行到指定位置viewer.camera.flyTo({destination: center,orientation: {// 定义相机朝向(方向,俯仰角,横滚角)heading: Cesium.Math.toRadians(360),pitch: Cesium.Math.toRadians(pitch),roll: Cesium.Math.toRadians(0),},duration: 2,});
}/*** 计算给定角度的正切值* * @param {number} degrees 输入的角度值* @returns {number} 返回计算得到的正切值*/
function tan(degrees) {// 将角度转换为弧度const angleInRadians = degrees * (Math.PI / 180);return Math.tan(angleInRadians);
}
http://www.lryc.cn/news/425692.html

相关文章:

  • C/C++开发---全篇
  • Android全面解析之context机制(二): 从源码角度分析context创建流程(上)
  • WPS真题题库导入刷题小程序:百思考个人使用经验分享
  • 拯救者双系统问题 Verifiying shim SBAT data failed: Security Policy Violation
  • ThreeJs学习笔记--坐标系,光源,相机控件
  • 基于 Android studio 实现停车场管理系统--原创
  • 8 个最佳 Java IDE 和文本编辑器
  • 【2024最新版版】PyCharm安装教程
  • 奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?
  • Java进阶篇之包的概念及其应用
  • 短剧出海,赚钱新途径,掌握海外短剧CPS分销的秘诀
  • uniapp小程序openid和unionId
  • 前端工程化-04.Vue项目简介
  • 10 Checkbutton 组件
  • 获奖方案|趋动科技:资源池化释放AI算力价值
  • Gin框架接入pyroscope完美替代pprof实现检测内存泄露
  • 记录一个lombok和mybatisplus的问题,@Data注解失效
  • React学习-初始化react项目
  • ubuntu查看CPU、内存、硬盘
  • 第5章 使用Intent和IntentFilter通信
  • AI产品经理需要了解的算法知识
  • OD C卷 - 结对编程
  • AcWing 723. PUM
  • 编译安装php7.4.33正确开启opcache,不只是去掉opcache.enable=1前面的分号
  • ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程
  • MySQL中的distinct和group by哪个效率更高?
  • STM32F103C8T6单片机原理图设计(PCB板)
  • Qt自定义控件:关于大佬“飞扬青云“的自定义UI控件的使用教程(MinGw,MSVC)
  • 关于RCE
  • 深入理解npm:从入门到精通