GIS融合之路(三)CesiumJS和ThreeJS相机同步
同样在这篇文章开始前重申一下,山海鲸并没有使用ThreeJS引擎。但由于ThreeJS引擎使用广泛,下文中直接用ThreeJS同CesiumJS的整合方案代替山海鲸中3D引擎和CesiumJS整合。
系列传送门:
山海鲸可视化:GIS融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?
山海鲸可视化:GIS融合之路(二)CesiumJS和ThreeJS深度缓冲区整合
按照惯例,文章开始前先自夸,大家可以参考一下山海鲸中相机整合的效果。
详细的内容可以前往这篇视频教程:
感兴趣朋友也欢迎下载软件试一试:山海鲸可视化-一站式数字孪生开发平台-海量数据可视化大屏模板
相机的整合分为三个部分,分别是:1.同步相机fov 2.同步相机位置 3.同步相机方向
一、同步相机fov
我们先来处理最简单的相机fov,我们先看下相机的fov是什么:

可以看出,相机的fov就是相机的视角宽度和高度,我们日常所说的广角相机,鱼眼相机就是fov很大的相机,而相机主要有两个fov参数,一个是横向的vfov,一个是纵向的hfov,因此我们只需要把两个相机自己的fov对应设置上即可,我们先看一下两边的文档中分别怎么描述自己的fov的:


此处一定要敲黑板,fov本身是一个很简单的概念,理论上直接同步两边相机的fov就可以完成。但这里面起码有两个坑,一个是Cesium用的是radians,而threejs用的是degrees,需要做一次转换。另外 CesiumJS有两个fov,和threejs对应的是fovy。这两个问题处理好了就简单了,代码也很简单。
THREE.camera.fov = Cesium.Math.toDegrees(CESIUM.viewer.camera.frustum.fovy)
当然山海鲸采用的是双向同步,反过来的话只需要根据文档内容将山海鲸引擎的fov赋值给CESIUM即可。
二、同步相机位置
搞定了相机fov,下一步就是同步相机的位置,同步相机位置就得先了解一下Cesium的坐标系,我们主要要用到Cesium的两套坐标系,一个是地心坐标,一个是经纬度坐标系。这两个坐标系间Cesium提供了标准的转换方法。
而Cesium同Threejs的坐标转换时,Threejs使用的坐标系对应在Cesium中实际上是东北上坐标系,这两个坐标系的关系如图所示:

Cesium也提供的标准的函数来获得东北上坐标系和地心坐标系的转换矩阵,因此我们可以通过如下代码将Threejs中的坐标转换为Cesium中的地心坐标系,同理也可以反过来将Cesium中的地心坐标系转换为东北天坐标系,也就是threejs中的坐标系,实现坐标系的双向转换。
let origin = Cesium.Cartographic.toCartesian(originCartographic)
let transform = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
let result1 = Cesium.Matrix4.multiplyByPoint(transform, cameraPosition);
山海鲸中需要提供了两种控制方式,一种是控制Threejs相机同步到Cesium相机中,一种是控制Cesium相机同步到Threejs中。所以最后值得注意的就是在第一种方式中需要将Cesium相机自己的控制个关闭掉,这个也很简单,只需要调用以下代码即可:
scene.screenSpaceCameraController.enableInputs = false;
最后,值得注意的是Cesium除了提供3d球面绘制模式( Cesium.SceneMode.SCENE3D)以外,还提供了2.5d的绘制模式(Cesium.SceneMode.COLUMBUS_VIEW),在COLUMBUS_VIEW的模式下,则需要做一步web墨卡托坐标的投影才能够完成坐标转换。
至此,我们终于实现了双向的相机同步。完成了这些,GIS系统算是正式可以在山海鲸中使用了。而且后面的章节我们会提到,山海鲸开放了整合CesiumJS的接口,因此只需要开启反向相机同步,即可无缝的将之前的CesiumJS代码迁移过来了。虽然整合成功了,但是CesiumJS依然是CesiumJS的样子,并没有任何变化,如果是这样,为什么不直接用CesiumJS,干嘛还有整合呢?

我们当然不能就此止步,作为一个对客户负责的技术负责人,客户不仅要求山海鲸可以加载所有的GIS数据,还拿效果和UE对比,觉得Cesium For Unreal的视觉效果更好看。要求我们把Unreal的效果搬到Web上来,什么,你说不可能?没有条件,创造条件也要上。只能再苦一苦开发团队了。
GIS融合之路(三)CesiumJS和ThreeJS相机同步的更多相关文章
- BIM与GIS融合的意义——从智慧工地到智慧城市
随着智慧城市概念的发展,BIM与GIS融合的概念深入人心,通过整合BIM的参数化描述建筑组件性质的特性与GIS宏观的几何空间概念,将 BIM 描述单体建筑物的特性通过 GIS 拓展至三维城市. BIM ...
- 学习之路三十九:新手学习 - Windows API
来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...
- 我的VSTO之路(三):Word基本知识
原文:我的VSTO之路(三):Word基本知识 在前一篇文章中,我初步介绍了如何如何开发一个VSTO程序,在本文中,我将进一步深入介绍Word的插件开发.Word是一个大家在日常工作中一直接触的文档工 ...
- 相机IMU融合四部曲(三):MSF详细解读与使用
相机IMU融合四部曲(三):MSF详细解读与使用 极品巧克力 前言 通过前两篇文章,<D-LG-EKF详细解读>和<误差状态四元数详细解读>,已经把相机和IMU融合的理论全部都 ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- 转载 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等
随笔 - 353, 文章 - 1, 评论 - 5, 引用 - 0 三.并行编程 - Task同步机制.TreadLocal类.Lock.Interlocked.Synchronization.Conc ...
- 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等
在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory.ContinueWhenAll()来实现任务串 ...
- Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程
Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...
- Windows提高_2.3第三部分:内核区同步
第三部分:内核区同步 等待函数(WaitForObject) 等待函数的形式 单个:WaitForSingleObject 多个:WaitForMultipleObjects 一个可以被等待的对象通常 ...
- [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步
本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...
随机推荐
- linux服务器qps查询,查看当前linux服务器的QPS
https://blog.csdn.net/weixin_42119281/article/details/116595205 QPS:每秒查询率(QPS,Queries-per-second)是对一 ...
- 记一次 .NET 某传感器采集系统 线程爆高分析
一:背景 1. 讲故事 前段时间有位朋友微信找到我,说他的程序使用 hsl 库之后,采集 plc 时内存溢出,让我帮忙看一下怎么回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就 ...
- VideoPipe可视化视频结构化框架更新总结(2023-3-30)
项目地址:https://github.com/sherlockchou86/video_pipe_c 往期文章:https://www.cnblogs.com/xiaozhi_5638/p/1696 ...
- [CTF学习笔记]net-pack(WinShark)
题目:shark on wire 1 Description We found this packet capture. Recover the flag. 思路 这里懂得了winshark的一些基本 ...
- AlphaFold2无痛安装教程(超级详细)
目录 介绍 环境 安装 CMAKE安装 hmmer安装 HHsuite安装 Kalign安装 OpenMM安装 PDBfixer安装 Python依赖包安装 AlphaFold安装 AlphaFold ...
- data.frame数据框操作——R语言
统计分析中最常见的原始数据形式是类似于数据库表或Excel数据表的形式. 这样形式的数据在R中叫做数据框(data.frame). 数据框类似于一个矩阵,但各列允许有不同类型:数值型向量.因子.字符型 ...
- 使用kubeadm快速启用一个集群
使用kubeadm快速启用一个集群 CentOS 配置YUM源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] n ...
- Kubernetes(K8S)内核优化常用参数详解
net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=10 net ...
- [Linux]常用命令之【source|export/env】#点命令/环境变量#
1 source 1-1 source 命令概述 source命令用法:source FileName 简述 source命令(从 C Shell 而来)是bash shell的内置命令. sourc ...
- day32:进程&进程join&守护进程deamon
目录 1.进程的基本概念 2.进程初体验 3.join:先子后主 4.守护进程:deamon 5.使用自定义类的方式创建进程 6.两张和进程相关的图 进程的基本概念 什么是进程? 进程就是正在运行的程 ...