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

这篇具有很好参考价值的文章主要介绍了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

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

相机的整合分为三个部分,分别是: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上来,什么,你说不可能?没有条件,创造条件也要上。只能再苦一苦开发团队了。文章来源地址https://www.toymoban.com/news/detail-481174.html

到了这里,关于GIS融合之路(三)CesiumJS和ThreeJS相机同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • threejs动态调整相机位置

    本文实现的效果是,模型渲染出来后,根据用户点击模型的某部分,将相机定位到鼠标点击的位置,并放大 监听模型点击事件 点击事件 调整相机位置 不过此文的相机调整比较快、生硬,没有那种渐进式的感觉,哪位博主有更好的方法了请在下面留言哦

    2024年02月04日
    浏览(29)
  • threejs让模型始终面向相机

    需求:threejs导入3D模型,改变相机位置的同时,让模型始终面向相机。 实现方式:使用模型的lookAt()方法,设置模型lookAt的值 首次加载模型时,面向相机 相机云顶==运动时,模型面向相机

    2024年02月12日
    浏览(29)
  • 无人机遥感在农林信息提取中的实现方法与GIS融合制图教程

    详情点击链接:无人机遥感在农林信息提取中的实现方法与GIS融合制图 遥感技术作为一种空间大数据手段,能够从多时、多维、多地等角度,获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势,是智慧农业必须采用的重要技术之一。              

    2024年02月12日
    浏览(33)
  • threejs使用gui改变相机的参数

    定义相机的配置: gui中加入调节fov的方法 实现效果 定义参数: 初始化相机,设置相机位置。 加入gui的配置 最后的效果  

    2024年02月12日
    浏览(25)
  • threejs 实现场景漫游效果(相机沿着自定义轨道移动)

    效果视频: Video_22-06-15_18-10-11 实现思路:先创建一条曲线curve作为运动路线,然后使用const points = curve.getPoints(n)方法将curve分成n-1段;我们可以通过points[n] 获取第n个点的坐标位置;将相机的位置设置为这个坐标,在动画中不断地修改n的值达到移动的效果;具体操作如下:

    2024年02月11日
    浏览(74)
  • threejs 相机控制camera-controls鼠标和触摸

    npm i camera-controls 官网地址:相机控制 - npm (npmjs.com) three.js 的相机控件,类似于 THREE。OrbitControls 还支持平滑过渡和 es6 导入。 相机移动 用户输入 轨道旋转 鼠标左键拖动/触摸:单指移动 多莉(变焦) 鼠标中键拖动,或鼠标滚轮/触摸:双指捏合或捏出 卡车(平底锅) 鼠标

    2024年01月24日
    浏览(29)
  • AMRT 3D 数字孪生引擎(轻量化图形引擎、GIS/BIM/3D融合引擎):智慧城市、智慧工厂、智慧建筑、智慧校园。。。

    1、提供强大完整的工具链 AMRT3D包含开发引擎、资源管理、场景编辑、UI搭建、项目预览和发布等项目开发所需的全套功能,并整合了动画路径、精准测量、动态天气、视角切换和动画特效等工具。 2、轻量化技术应用与个性化定制 AMRT3D适用于快速开发数字孪生3D可视化项目、

    2024年04月22日
    浏览(90)
  • threejs平滑地移动相机的位置,将其逐渐接近目标点位置(tweemjs)

    一、npm安装tweemjs 二、引入tweemjs 三、使用 注:这里需要在requestAnimationFrame内调用TWEEN.update();不然动画不生效。

    2024年02月12日
    浏览(33)
  • 3D激光雷达和相机融合

    主要看重投影误差,cv的标定识别率也太低了。。。原因是找到了,相机给的曝光时间5ms,增大曝光时间成功率大大提升,但曝光时间给打了,影响实时性,头疼。。 主要是3D-2D的标定 采集标定数据 参照以下采集标定数据和处理标定数据,pcd角点选取和图像角点选取: https:

    2024年02月06日
    浏览(38)
  • 红外相机和RGB相机标定:实现两种模态数据融合

    RGB相机:森云智能SG2-IMX390,1个 红外相机:艾睿光电IR-Pilot 640X-32G,1个 红外标定板:https://item.taobao.com/item.htm?_u=jp3fdd12b99id=644506141871spm=a1z09.2.0.0.5f822e8dKrxxYI 两种模态相机均未进行内参标定,如果发现原始图片畸变较大,可以先进行内参标定。数据采集代码如下,加热红外标定

    2024年04月17日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包