Cesium实践(3)——坐标系与相机系统

news2025/1/18 7:38:16

文章目录

  • 前言
  • Cesium 坐标系
    • 屏幕坐标系
    • 空间直角坐标系
    • WGS-84坐标系
  • 坐标系转换
    • 角度与弧度互转
    • 84坐标转笛卡尔空间坐标
    • 笛卡尔空间坐标转84坐标
    • 屏幕坐标转笛卡尔空间坐标
    • 笛卡尔空间直角坐标转屏幕坐标
  • Cesium相机
    • 默认交互
    • 相机姿态参数
    • 常用方法
      • DEFAULT_VIEW_RECTANGLE
      • setView
      • flyTo
      • flookAt
  • 总结


前言

本文介绍Cesium世界中的坐标系统,Cesium的坐标系分三种:屏幕坐标、笛卡尔空间直角坐标、地理坐标,在得知目标的坐标后,即可使用相机系统对目标进行定位或进行相机交互。


Cesium 坐标系

屏幕坐标系

屏幕坐标系是一个是平面直角坐标系,即二维笛卡尔坐标系,屏幕左上角为原点(0,0),单位为像素值,屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正。构造函数为 new Cesium.Cartesian2(x, y)

空间直角坐标系

以椭球的中心为原点,建立三条两两垂直的数轴构成的坐标系。由于在计算机中不方便使用经纬度进行绘图,一般会将坐标系转换为笛卡尔坐标系。构造函数为 new Cesium.Cartesian3(x, y, z)

WGS-84坐标系

World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH (国际时间服务机构)1984.O定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系。我们平常手机上的指南针显示的经纬度就是这个坐标系下当前的坐标,进度范围[-180,180],纬度范围[-90,90]。

WGS84坐标系包括构造函数为 new Cesium.Cartographic(x,y,z),注意参数皆为弧度制

在这里插入图片描述

坐标系转换

角度与弧度互转

    // 角度转弧度
   const radians = Cesium.Math.toRadians(45.0);
    console.log('角度45.0转弧度======', radians);
    // 弧度转角度
    const degrees = Cesium.Math.toDegrees(1/4 * Math.PI);
    console.log('弧度 1/4 Π 转角度======', degrees);

在这里插入图片描述

84坐标转笛卡尔空间坐标

    // 传经纬度、高
    const cartesian3_1 = Cesium.Cartesian3.fromDegrees(116, 40.4,100);
    // 传经纬度数组
    const cartesian3_2 = Cesium.Cartesian3.fromDegreesArray([116, 40.4, 117,39.4]);
    // 传经纬度、高数组
    const cartesian3_3 = Cesium.Cartesian3.fromDegreesArrayHeights([116, 40.4,100, 117, 39.4, 200]);
    console.log(cartesian3_1);
    console.log(cartesian3_2);
    console.log(cartesian3_3);

在这里插入图片描述
使用 fromRadiansfromRadiansArrayfromRadiansArrayHeights 同理,可将弧度制的84坐标转换为笛卡尔空间坐标。

笛卡尔空间坐标转84坐标

	// 将笛卡尔坐标转84坐标(弧度制)
    const cartographic = Cesium.Cartographic.fromCartesian(cartesian3_1);
    console.log('输入笛卡尔坐标===', cartesian3_1);
    console.log('转换后84坐标(弧度)===', cartographic);

在这里插入图片描述

屏幕坐标转笛卡尔空间坐标

为了防止不必要的性能消耗,cesium为不同的场景提供了不同的转换方法

  • 只考虑球面

使用场景参考:Cesium地图中显示鼠标经纬度

const cartesian3 = Cesium.viewer.scene.pickEllipsoid(cartesian2)
  • 考虑球面、地形,不考虑三维模型

const cartesian3 = Cesium.viewer.scene.globe.pick(
	viewer.camera.getPickRay(cartesian2),
	viewer.scene
); 
  • 考虑球面、地形,三维模型

使用场景参考:Cesium为3dTile模型添加气泡框

const cartesian3 = Cesium.viewer.scene.pickPosition(cartesian2)

笛卡尔空间直角坐标转屏幕坐标

使用场景参考:Cesium为3dTile模型添加气泡框

const Cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
      scene,
      cartesian3
    );

Cesium相机

默认交互

在三维世界中不仅需要确定视点的位置,还需要确定视线方向,Cesium通过相机来控制场景中的视域,旋转、缩放、平移等操作都可控制相机移动。Cesium具有默认的鼠标和触摸事件处理程序和摄像头交互:

  • 左键单击并拖动:移动整个地图
  • 右键单击并拖动:放大和缩小相机
  • 中轮滚动:放大和缩小相机
  • 中键点击并拖动:围绕地球表面的点旋转相机

相机姿态参数

Cesium通过Orientation来确定相机的方向,其设定原理和右手笛卡尔坐标系原理相同,主要包括以下三个参数:

  • heading( 偏航角): 默认方向为正北(0°),正角度为向东旋转,即左右摇头。
  • pitch( 俯仰角): 默认角度为-90°,即朝向地面,0°为平视,正角度为仰视,负角度为俯视,即抬头低头。
  • roll( 翻转角): 默认角度为0°,正角度向右旋转,负角度向左旋转,即左右翻滚。

常用方法

DEFAULT_VIEW_RECTANGLE

设置cesium默认视角范围

  Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
    110, // 西边的经度   
    39, // 南边维度  
    120, // 东边经度    
    41 // 北边维度 
  );
  

在这里插入图片描述

setView

将视角切换到目标范围内,没有飞行过程,快速切换

viewer.camera.setView({
    // 指定相机位置
    destination: Cesium.Cartesian3.fromDegrees(119, 40, 100),
    // 指定相机视角
    orientation: {
      heading: Cesium.Math.toRadians(0),
      pitch: Cesium.Math.toRadians(-20),
      roll: 0,
    },
  });

flyTo

相机空中飞行至目标视域。

viewer.camera.setView({
    // 指定相机位置
    destination: Cesium.Cartesian3.fromDegrees(119, 40, 100),
    // 指定相机视角
    orientation: {
      heading: Cesium.Math.toRadians(0),
      pitch: Cesium.Math.toRadians(-20),
      roll: 0,
    },
    duration: 1,  // 相机飞行持续的时间
   // pitchAdjustHeight: -90, //如果摄像机飞越高度高于该值,则会调整俯仰角度,保证地球在视域中
   // flyOverLongitude:100, //相机飞向目的地的过程中,必须强制经过东经100°子午线
  });

flookAt

相机视角固定在目标位置

var position = Cesium.Cartesian3.fromDegrees(119, 40, 100); 
var heading =  Cesium.Math.toRadians(10);
var pitch = Cesium.Math.toRadians(-80.0);
var range = 0;
viewer.camera.lookAt(position,new Cesium.HeadingPitchRange(heading,pitch,range));

总结

Cesium 坐标系

  • 屏幕坐标系
  • 空间直角坐标系
  • WGS-84坐标系

坐标系转换

  • 角度与弧度互转
  • 84坐标转笛卡尔空间坐标
  • 笛卡尔空间坐标转84坐标
  • 屏幕坐标转笛卡尔空间坐标
  • 笛卡尔空间直角坐标转屏幕坐标

Cesium相机

  • 默认交互
  • 相机姿态参数
  • 常用方法

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

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

相关文章

关于DMA的笔记

DMA(Direct Memory Access, 直接储存器访问),是部分总线架构提供的功能,DMA传输功能能将数据从一个地址空间复制到另一个地址空间,实现从附加设备/外设与储存器或储存器与储存器之间的高速传输。 我们结合案例解释DMA的功能:在我…

HTTPS 加密协议

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录HTTPS"加密" 是什么HTTPS 的工作过程引入证书HTTPS http 安全层 (SSL) SSL 用来加密的协议,也叫 TLS …

类型转换——C++

1. C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化, C语言中总共有两种形式的类型转换:隐式类型转换…

刘二大人《Pytorch深度学习实践》第十讲卷积神经网络(基础篇)

文章目录卷积神经网络基础卷积层池化层课上代码GPU版本代码卷积神经网络基础 全连接的网络将图片的的本身二维空间结构进行了破坏,而这些空间结构是有用的,因此,要定义新的操作图像的计算节点,因此引入了卷积神经网络,…

JavaWeb开发 —— 请求响应

目录 一、概述 二、请求 1. postman工具 2. 简单参数 3. 实体参数 4. 数组集合参数 5. 日期参数 6. JSON参数 7. 路径参数 三、响应 1. ResponseBody 2. 统一响应结果 3. 案例 一、概述 通过之前对 JavaWeb开发 —— Web入门 的学习,我们开发…

失眠一月码出527页文档,详解SpringCloud微服务和分布式系统实践

所谓的分布式系统,就是一组计算机为了共同完成业务功能通过网络协作的多节点系统。分布式系统本身也有一系列需要解决的问题,包括多个计算机节点的路由选择、各个服务实例的管理、节点监控、节点之间的协作和数据一致性等,当然还有网络故障、…

lamp 架构的搭建

php 解释动态页面 php来连接数据库 mysql 页面信息和端口信息 存放数据 apache 前端web服务器,展现页面 源码编译安装这三个服务 配置下载apache: systemctl stop firewalld 关闭安全机制,防火墙 可以一条命令:systemctl is-enabled firewalld 和 s…

【推荐系统】model 落地(样本/特征/预测服务)

兜率宫小道童的个人空间-兜率宫小道童个人主页-哔哩哔哩视频(如下是该视频课系列的笔记) 1-深度学习在搜索、广告、推荐系统中的应用-业务问题建模_哔哩哔哩_bilibili 其他章节 目录 二、深度学习落地 模型训练服务流程 1-样本生成-标签拼接 1-样本…

OJ练习第73题——解数独

解数独 力扣链接:37. 解数独 题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一…

MySQL-中间件mycat(二)

目录 🍁部署主从复制 🍁mycat读写分离 🍂修改配置文件 🍂设置balance与writeType 🍂设置switchType与slaveThreshold 🍂启动程序 🍂验证读写分离 🍁垂直拆分-分库 🍂实现…

【从零开始学Skynet】基础篇(九):调试控制台服务

Skynet自带了一个调试控制台服务debug_console,启动它之后,可以查看节点的内部状态。 1、启用调试控制台 (1)在skynet/examples目录下新建main_console.lua文件,代码如下所示: local skynet require &quo…

【Python_Scrapy学习笔记(二)】创建Scrapy爬虫项目

创建Scrapy爬虫项目 前言 本文主要介绍如何创建并运行 Scrapy 爬虫项目。 正文 1、创建 Scrapy 框架 Scrapy 框架提供了 scrapy 命令用来建立 Scrapy 工程,在终端 terminal 中输入以下命令: scrapy startproject 自定义的项目名称创建好爬虫项目文件…

2023年超实用的27个VSCode插件推荐

Visual Studio Code,或者称作VS Code,是一个广为人知且评价很高的代码编辑器,它有许多特性和扩展功能,以增强开发体验。使用VS Code的主要好处之一是它的灵活性,允许开发人员根据自己的特定需求进行自定义。此外&#…

02-app漏洞发现

漏洞发现-APP应用之漏洞探针类型利用修复 一、思维导图: 思路说明: apk反编译提取URL或抓包获取url,进行web应用测试,如不存在或走其他协议的情况下,需采用网络接口抓包进行数据获取,转至其他协议安全测试…

【jvm系列-05】精通运行时数据区共享区域---方法区

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

Redis 6.0的多线程是如何工作的

来了解下 6.0 版本中新出的多线程特性。 1、多线程处理网络IO,单线程执行命令 Redis 一直被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF 重写),但是&…

freeswitch带媒体压力测试方案

概述 原本的计划是使用sipp完成带媒体压力测试,但是实际测试过程中发现sipp的媒体处理功能有问题(也有可能是我使用的姿势不对)。 sipp在带媒体的情况下(600路并发开始),出现大量的不响应和响应延迟&…

请求响应-响应

前面已经说了我们重点关注的就是XXXcontroller类 进行请求接收 和响应 接收参数那些我们在请求部分讲过了 现在我们来处理响应部分 响应 设置响应数据 可以发现其实我们之前都是设置过的 比如那个Hello World 浏览器都接收到了且在浏览器上进行了输出 这里的是返回值作为这个…

Direct3D 12——纹理——纹理

纹理不同于缓冲区资源,因为缓冲区资源仅存储数据数组,而纹理却可以具有多个mipmap层级(后 文有介绍),GPU会基于这个层级进行相应的特殊操作,例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式…

7 个最好的 Word 转 PDF 转换器

如果您使用 Word 文件,您可能在某个时候遇到过将 Word 文件转换为 PDF 的紧迫问题。PDF 文件有很多优点。它们通常更紧凑,无论您在哪里打开它们看起来都一样。PDF 还允许您共享文档,而不必冒有人更改内容的风险。那么如何将 Word 文档转换为 …