GIS融合之路(三)CesiumJS和ThreeJS相机同步

同样在这篇文章开始前重申一下,山海鲸并没有使用ThreeJS引擎。但由于ThreeJS引擎使用广泛,下文中直接用ThreeJS同CesiumJS的整合方案代替山海鲸中3D引擎和CesiumJS整合。

系列传送门:

山海鲸可视化:GIS融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?

山海鲸可视化:GIS融合之路(二)CesiumJS和ThreeJS深度缓冲区整合

按照惯例,文章开始前先自夸,大家可以参考一下山海鲸中相机整合的效果。

详细的内容可以前往这篇视频教程:

【合集】山海鲸可视化V3.0GIS系统使用教程_超详细教程_哔哩哔哩_bilibili​www.bilibili.com/video/BV1Se4y1p7oe/?spm_id_from=333.788&vd_source=982603da51450176a5928e609ce7d1b6正在上传…重新上传取消https://www.bilibili.com/video/BV1Se4y1p7oe/?spm_id_from=333.788&vd_source=982603da51450176a5928e609ce7d1b6

感兴趣朋友也欢迎下载软件试一试:山海鲸可视化-一站式数字孪生开发平台-海量数据可视化大屏模板

相机的整合分为三个部分,分别是1.同步相机fov 2.同步相机位置 3.同步相机方向

一、同步相机fov

我们先来处理最简单的相机fov,我们先看下相机的fov是什么:

相机的fov示意

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

CesiumJS中的fov

ThreeJS中的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三种坐标系

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上来,什么,你说不可能?没有条件,创造条件也要上。只能再苦一苦开发团队了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CesiumThree.js是两种流行的3D图形库,它们可以结合使用来加载和渲染3D Tile数据。 首先,我们需要了解3D Tile是什么。3D Tile是一种开放标准的3D地理空间数据格式,它使用了网格化的数据结构,可以将大规模的地理空间数据以图块(Tiles)的形式进行存储、传输和渲染。它支持以地理坐标系为基础的渲染和空间分析,可以用于展示城市模型、地形数据、空间环境等。 要在Cesium中加载和渲染3D Tile数据,我们可以使用Cesium的Tileset类。Tileset类能够处理3D Tile数据集,并根据视口和细节级别动态加载和渲染图块。我们可以使用Cesium的Viewer类创建一个窗口,然后使用Tileset类加载3D Tile数据集,调用其show方法将其显示在场景中。 而要结合Three.js来进行渲染,我们可以通过Cesium提供的API将3D Tile数据转换为Three.js可识别的模型格式,如glTF或Collada。然后,我们可以使用Three.js的Loader类加载这些模型,并通过设置材质、光照等参数来实现渲染效果。最后,我们可以将加载后的模型添加到Three.js的场景中,与其他Three.js的元素一起进行渲染和交互操作。 总而言之,结合CesiumThree.js来加载和渲染3D Tile数据,可以借助Cesium的Tileset类加载和管理3D Tile数据集,然后将其转换为Three.js可识别的模型格式,使用Three.js的Loader类加载并进行渲染,最后将加载后的模型添加到Three.js的场景中进行展示。这样,我们可以充分利用CesiumThree.js的优势,实现更加丰富和高效的3D地理空间数据的加载和渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值