Cesium常见设置视角所用到函数

 1.左键拾取经纬度坐标

const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)// 监听鼠标点击事件handler.setInputAction(function (click) {// 使用pick函数获取点击位置的实际位置var cartesian = viewer.scene.pickPosition(click.position);if (Cesium.defined(cartesian)) {// 将笛卡尔坐标转换为经纬度坐标var cartographic = Cesium.Cartographic.fromCartesian(cartesian);var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);var heightString = cartographic.height.toFixed(2);console.log('经度:' + longitudeString + ',纬度:' + latitudeString + ',高度:' + heightString)}// 使用Scene.pick来获取3D Tiles的实际高度var pickedObject = viewer.scene.pick(click.position);if (Cesium.defined(pickedObject)) {// 获取到3D Tiles的高度const cartographic = Cesium.Cartographic.fromCartesian(cartesian);const height = cartographic.height;const lon=Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);const lat =Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);console.log('点击位置的经度是: ' + lon);console.log('点击位置的纬度是: ' + lat);console.log('点击位置的高度是: ' + height);}}, Cesium.ScreenSpaceEventType.LEFT_CLICK)

2.获取当前视角heading\pitch\roll 

function getPostion() {const camera = viewer.scene.cameraconst cartographic = Cesium.Cartographic.fromCartesian(camera.position)const x = Cesium.Math.toDegrees(cartographic.longitude)const y = Cesium.Math.toDegrees(cartographic.latitude)const z = cartographic.heightlet pt = Cesium.Cartographic.fromDegrees(x, y, z);let ellipsoid = viewer.scene.globe.ellipsoid;let cartesian3 = ellipsoid.cartographicToCartesian(pt);let objinfo = {"经度": x,"维度": y,"高度": z,"x": cartesian3.x,"y": cartesian3.y,"z": cartesian3.z,"heading": camera.heading,"pitch": camera.pitch,"roll": camera.roll}console.log(objinfo)}

3.设置视角至指定位置(相机)

  • setView方法:用于设置相机的位置、朝向和视角。可以一次性设置相机的目标位置(destination)和朝向(orientation
  • flyTo方法:与setView类似,但它是平滑地飞到指定位置,可以设置飞行时间(duration)和完成后的回调函数。
  • lookAt方法:使相机对准指定的位置或实体,但不改变相机的当前高度。它也可以接受一个orientation参数来设置相机的朝向。
  • zoomTo()方法的基本形式接受一个目标参数(如实体、数据源等)和一个可选的HeadingPitchRange对象,用于指定相机的姿态。目标参数可以是EntityEntity[](实体数组)、EntityCollectionDataSource等。
//flyto()
viewer.camera.flyTo({  destination: position,  orientation: {  heading: Cesium.Math.toRadians(0.0), // 正北  pitch: Cesium.Math.toRadians(-10.0), // 稍微向下倾斜以更好地观察地面  roll: 0.0  },  duration: 5000  
});//zoomtTo()var headingPitchRange = new Cesium.HeadingPitchRange(heading, pitch, range);  
viewer.zoomTo(entity, headingPitchRange);//setViewer()
viewer.camera.setView({  destination: Cesium.Cartesian3.fromDegrees(lon, lat, height), // 相机目标位置  orientation: { // 相机朝向  heading: Cesium.Math.toRadians(heading), // 偏航角  pitch: Cesium.Math.toRadians(pitch), // 俯仰角  roll: Cesium.Math.toRadians(roll) // 翻滚角  }  
});
//lookAt()
var target = Cesium.Cartesian3.fromDegrees(lon, lat, height);  
viewer.camera.lookAt(target, new Cesium.HeadingPitchRange(heading, pitch, range));

3.设置视角至指定位置(实体)

  • 如果你正在添加一个实体(如模型、点、线等)到Cesium中,并且想要设置它的方向(即视角),你可以通过设置该实体的orientation属性来实现。这通常涉及到使用四元数(Quaternion)来表示旋转,但Cesium也提供了HeadingPitchRoll类来简化这个过程。
//orientation属性
var position = Cesium.Cartesian3.fromDegrees(lon, lat, height);  
var entity = viewer.entities.add({  position: position,  model: {  uri: 'path/to/model.gltf',  scale: 1.0  },  orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(heading, pitch, roll))  
});

Cesium中的四元数(Quaternion)是一种用于表示三维空间中旋转的数学工具,它由四个分量组成,通常表示为(w, x, y, z),其中w是实部,x、y、z是虚部。在Cesium中,四元数主要用于描述物体的旋转和姿态,具有精确、高效和稳定的特点。以下是对Cesium中四元数的详细解释:

一、四元数的基本概念

  • 组成:四元数由一个实部和三个虚部组成,表示为(w, x, y, z)。
  • 旋转表示:在Cesium中,四元数常用于表示物体的旋转。通过四元数,可以精确地描述物体在三维空间中的旋转,且相比欧拉角,四元数没有万向锁问题,能够避免由于旋转顺序引起的计算错误。

二、四元数的应用

  1. 旋转表示
    • 在Cesium中,通过四元数可以精确地描述物体在三维空间中的旋转方向和角度。
    • 使用Transforms.headingPitchRollQuaternion(position, hpr)等方法,可以根据物体的位置(position)和欧拉角(hpr,包括航向heading、俯仰pitch、横滚roll)来计算朝向四元数。
  2. 插值计算
    • 四元数可以用于实现旋转的平滑插值计算。通过对两个四元数进行插值运算,可以实现物体在旋转过程中的平滑过渡,提升视觉效果和用户体验。
  3. 姿态控制
    • 在飞行器模拟、虚拟现实和游戏开发等领域,四元数常用于控制物体的姿态。通过调整四元数的参数,可以精确地控制物体的旋转和姿态,使其符合预期的运动轨迹和角度变化。
  4. 坐标变换
    • 在Cesium中,四元数也常用于实现坐标系之间的变换。通过四元数的乘法运算,可以方便地实现不同坐标系之间的旋转变换,从而实现物体在不同坐标系下的准确定位和旋转。

三、四元数的计算与转换

  • 从欧拉角到四元数:可以使用Cesium提供的Transforms.headingPitchRollQuaternion等方法,根据物体的欧拉角和位置来计算朝向四元数。
  • 从四元数到欧拉角:虽然Cesium直接提供了从欧拉角到四元数的转换方法,但从四元数反推欧拉角可能需要手动计算或使用特定的函数库。
  • 四元数的乘法和归一化:在进行四元数运算时,需要注意四元数的乘法和归一化操作,以确保旋转的正确性和稳定性。

四、结论

Cesium中的四元数作为一种用于描述旋转的数学工具,具有广泛的应用价值。掌握四元数在Cesium中的应用,对于开发基于Cesium的三维应用具有重要意义。通过合理使用四元数,可以精确地描述和控制物体的旋转、姿态和坐标变换,提升三维场景中物体运动的真实感和视觉效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】十二、递归:斐波那契 + 反转链表

文章目录 1、递归2、leetcode509:斐波那契数列3、leetcode206:反转链表4、leetcode344:反转字符串 1、递归 函数自己调用自己 递归的4个点: 递归的例子:给一个数n,在斐波那契数列中,找到n对应的…

科研与英文学术论文写作指南——于静老师课程

看到了一个特别棒的科研与英文学术论文写作指南,理论框架实例。主讲人是中科院信息工程研究所的于静老师。推荐理由:写论文和读论文或者讲论文是完全不一样的,即使现在还没有发过论文,但是通过于老师的课程,会给后续再…

LSTM水质预测模型实践

0 引言 随着水质自动站的普及,监测频次越来越高,自动监测越来越准确。 水质站点增多,连续的水质监测数据,给水质预测提供更多的训练基础。 长短时记忆网络(LSTM)适用于多变量、连续、自相关的数据预测。 人工神经网络模型特点为的…

使用requests爬取拉勾网python职位数据

爬虫目的 本文是想通过爬取拉勾网Python相关岗位数据,简单梳理Requests和xpath的使用方法。 代码部分并没有做封装,数据请求也比较简单,所以该项目只是为了熟悉requests爬虫的基本原理,无法用于稳定的爬虫项目。 爬虫工具 这次…

LVS 负载均衡群集

一:LVS群集应用基础 1.1:概述 1.群集的类型 无论是哪种群集, 都至少包括两台节点服务器, 而对外表现为一个整体, 只提供一个访问入口。根据群集所针对的目标差异, 可分为以下三种类型。 负载均衡群集&a…

使用U盘重装系统

目录 一、 制作启动盘 1. 准备一个U盘和一台电脑 2. 下载win10安装包 二、安装操作系统 1. 插入系统安装盘 2. 通过进入BIOS界面进入到我们自己制作的启动盘上 三、安装成功后进行常规设置 一、 制作启动盘 1. 准备一个U盘和一台电脑 注意:提前备份好U盘内的…

jQuery Tooltip 插件使用教程

jQuery Tooltip 插件使用教程 引言 jQuery Tooltip 插件是 jQuery UI 套件的一部分,它为网页元素添加了交互式的提示框功能。通过这个插件,开发者可以轻松地为链接、按钮、图片等元素添加自定义的提示信息,从而增强用户的交互体验。本文将详细介绍如何使用 jQuery Tooltip…

JDK1.8下载、安装与配置完整图文2024最新教程

一、报错 运行Pycharm时,报错No JVM installation found. Please install a JDK.If you already have a JDK installed, define a JAVA_HOME variable in Computer >System Properties > System Settings > Environment Variables. 首先可以检查是否已安装…

【C语言】qsort()函数详解:能给万物排序的神奇函数

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(c…

2024西安国际储能产业博览会将于12月5日开幕!

2024西部国际储能产业博览会 同期举办:2024西部国际氢能源及燃料电池产业博览会 2024年12月5-7日 西安国际会展中心 规划展会规模: 50,000 ㎡ 450 60000人次 20场 展区面积 预邀展商 专业观众 行业…

节水增效,蜂窝物联智能灌溉助力农业升级!

智能灌溉的优势主要体现在以下几个方面: 1. 提高效率:智能灌溉可以根据作物生长的不同阶段和环境条件自动调整灌溉时间和水量,减少人工干预的频率和时间,提高了灌溉效率。 2. 节约水资源:智能灌溉可以根据土壤湿度和…

Python爬虫实战案例——王者荣耀皮肤抓取

大家好,我是你们的老朋友——南枫,今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩,直接上代码: 导入我们需要使用到的,也是唯一用到的库: 我们要抓取皮肤其…

网络物理隔离

网络物理隔离是网络安全领域中的一种基本策略,其核心目的是通过物理方式将网络或网络设备分隔开来,以确保数据安全、降低风险并提升系统的整体安全性。网络物理隔离不仅防止了未经授权的访问,也显著降低了来自外部或内部威胁的风险。以下是网…

每天一个数据分析题(四百)- 一元线性回归模型

评价一元线性回归模型拟合程度时,主要根据( )的数值 A. 相关系数 B. R2 C. SSE D. SSR 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python,SQL&…

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的,商家给的资料中首先让配置网口,但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达,但wireshark可以正常抓到数…

PyPDF2拆分PDF文件的高级应用:指定拆分方式

本文目录 前言一、拆分方式选择1、代码讲解2、实现效果图3、完整代码前言 前两篇文章,分别讲解了将使用PyPDF2将PDF文档分割成为单个页面、在分割PDF文档时指定只分割出指定页面,如果你还没有看过,然后有需要的话,可以去看一下,我把文章链接贴到这里: PyPDF2拆分PDF文件…

Nuxt3 的生命周期和钩子函数(九)

title: Nuxt3 的生命周期和钩子函数(九) date: 2024/7/3 updated: 2024/7/3 author: cmdragon excerpt: 摘要:本文介绍了Nuxt3中与Vite相关的五个生命周期钩子,包括vite:extend、vite:extendConfig、vite:configResolved、vite…

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新,其中包含一个严重的安全漏洞,该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion,CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件(也…

双阶段目标检测算法:精确与效率的博弈

双阶段目标检测算法:精确与效率的博弈 目标检测是计算机视觉领域的一个核心任务,它涉及在图像或视频中识别和定位多个对象。双阶段目标检测算法是一种特殊的目标检测方法,它通过两个阶段来提高检测的准确性。本文将详细介绍双阶段目标检测算…

小型语言模型的兴起

过去几年,我们看到人工智能能力呈爆炸式增长,其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数,已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而,虽然 LLM 的能力令人印象深刻…