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.camera
        const cartographic = Cesium.Cartographic.fromCartesian(camera.position)
        const x = Cesium.Math.toDegrees(cartographic.longitude)
        const y = Cesium.Math.toDegrees(cartographic.latitude)
        const z = cartographic.height
        let 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.mfbz.cn/a/768300.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全隔离上网的有效途径:沙箱

在数字化浪潮日益汹涌的今天,网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制,为企业和个人提供了一种在享受网络便利的同时,保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网,从而为用户提…

(五十二)第 8 章 动态存储管理(边界标识法)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strr…

QT创建地理信息shp文件编辑器shp_editor

空闲之余创建一个简单的矢量shp文件编辑器&#xff0c;加深对shp文件的理解。 一、启动程序 二、打开shp文件 三、显示shp文件的几何图形 四、双击右边表格中的feature&#xff0c;主窗体显示选中feature的各个节点。 五、鼠标在主窗体中选中feature的节点&#xff0c;按鼠标左…

js学习--制作选项卡

选项卡制作 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>.text_one {width: 11.4%;height: 200px…

web前端开发(概述篇)

一、概念 Web是Internet上的一种多媒体信息服务系统&#xff0c;整个系统由Web服务器、浏览器和通信协议组成。 通信协议HTTP能够传输任意类型的数据对象&#xff0c;满足Web服务器与客户之间的多媒体通信的需求。 一般来说&#xff0c;Web开发分为前端&#xff08;Front-en…

番外篇 | 手把手教你如何去更换YOLOv5的检测头为ASFF_Detect

前言:Hello大家好,我是小哥谈。自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv5的检测头更换…

身边的故事(十三):阿文的故事:出现

如果他知道一件事情如果违背正常的市场规律就是骗局或者存在巨大的风险&#xff0c;比如市场正常投资回报率在5-6%已经算高回报&#xff0c;像股神巴菲特的投资回报率应该不会超过10%吧。那些说20-30%甚至更高回报率肯定是骗局。如果...哪有那么多如果&#xff0c;人生每一秒都…

从4D CT灌注成像中使用时空卷积神经网络预测急性缺血性中风的特定治疗病变结果| 文献速递-深度学习自动化疾病检查

Title 题目 Predicting treatment-specific lesion outcomes in acute ischemic stroke from 4D CT perfusion imaging using spatio-temporal convolutional neural networks 从4D CT灌注成像中使用时空卷积神经网络预测急性缺血性中风的特定治疗病变结果 01 文献速递介绍…

【电商指标详解】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本篇文章主要和大家分享一下电商行业中常见指标的详解&#xff01;存在的原因和作用&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你的画…

打卡第一天

今天是参加算法训练营的第一天&#xff0c;希望我能把这个训练营坚持下来&#xff0c;希望我的算法编程题的能力有所提升&#xff0c;不再面试挂了&#xff0c;面试总是挂编程题&#xff0c;记录我leetcode刷题数量&#xff1a; 希望我通过这个训练营能够实现两份工作的无缝衔接…

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表&#xff1a;是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括&#xff1a;客户信息、交易记录、产品数据、财务数据等。 做个比喻吧&#xff1a;数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

python中的文件

1.什么是文件&#xff1f; 硬盘上存储的数据都是以文件的形式来组织的~ 文件是数据在硬盘上的存储形式&#xff0c;不同的数据在硬盘上的存储形式是不同的&#xff0c; 2.文件路径 文件夹/目录。 文件夹&#xff0c;再包含文件夹的情况&#xff0c;这就是一个嵌套的关系&…

顺序表--数据结构第一关

顺序表 数据结构概念 定义&#xff1a;数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上&#xff0c;数组是最简单的数据结构 顺序表的底层就是数组 为什么呢&#xff1f; 例子如下&#xff1a; int arr[100]{1,2,3,4,5}; //修改某一个数据&#xff1a;arr[…

电子部件烧录流程(仅供参考)

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 部件烧录流程的详细步骤 1. 准备工作 2. 连接硬件 3. 配置烧录软件 4. 校验和设置 5. 开始烧录 6. 验证和测试 7. 断开…

吉利银河L6 AQS空气质量监控系统

结论 顶配才有AQS 开启空调且auto模式 则默认开启AQS 无法关闭AQS AQS的作用 银河L6 AQS触发 和 图标 AQS官方配置参数 官方文档 吉利用户手册

机器学习基础概念

1.机器学习定义 2.机器学习工作流程 &#xff08;1&#xff09;数据集 ①一行数据&#xff1a;一个样本 ②一列数据&#xff1a;一个特征 ③目标值&#xff08;标签值&#xff09;&#xff1a;有些数据集有目标值&#xff0c;有些数据集没有。因此数据类型由特征值目标值构成或…

数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法

概述 微服务是最近几年才兴起的概念。简单点将&#xff0c;就是把复杂的大应用&#xff0c;解耦成几个小的应用 。这样做的好处有很多。比如&#xff0c;这样有利于团队组织架构的拆分&#xff0c;比较团队越大协作的难度越大&#xff1b;再比如&#xff0c;每个应用都可以独立…

程序算法设计分析

动态规划和分治、贪心相比有什么区别&#xff1f;各自的优缺点&#xff1f; 分治算法特征&#xff1a; 1&#xff09;规模如果很小&#xff0c;则很容易解决。//一般问题都能满足 2&#xff09;大问题可以分为若干规模小的相同问题。//前提 3&#xff09;利用子问题的解&#x…

最靓丽的C++开源通知弹框SnoreToasts自动监听软件及网页通知

SnoreToasts&#xff0c;作为一款轻量级的C开源项目&#xff0c;为开发者提供了一个便捷的方式来在Windows操作系统上展示通知弹框&#xff08;Toast Notifications&#xff09;。 特点与优势 轻量级&#xff1a;SnoreToasts采用了简洁的代码设计&#xff0c;避免了不必要的依…