当前位置: 首页 > news >正文

Cesium的一些计算方法浅析(1)

自我感觉Cesium在处理地形瓦片的流程还是很复杂的。当然三维地球相比于二维地图来说,确实更复杂,在二维地图,你大抵只需要考虑矩形的空间关系。而在三维,不仅需要考虑视锥体有哪些瓦片,还需要采用一些负责的方法计算出Mesh。

由于分析源码好烧脑哈,因此本文先做一点杂烩,后面相关内容就里面补充吧。

1、大坐标下的传递(EncodedCartesian3

由于地球很大,因此坐标位置也需要很多数字位去表示。我们常用的经纬度在特殊情况下其实是不好用的,因为整数位才2位,而小数位非常多。JavaScript 中的数字类型是基于 IEEE 754 标准的双精度浮点数(double),而在WebGL中数值类型是float(单精度浮点数),因此不能直接将JS中的数值传递到WebGL,很可能丢失精度。

因此Cesium采用两个float值来表示在JS中的double值。具体而已就是第一个float(称为High位)存储整数,该整数可以被65536整除,第二个float(称为Low位)存储剩余整数+小数。在第一个float,由于可以被65536整除,因此在计算机中利用指数偏移值+部分的分数值就可以表示非常大的数了。同理,第二个float可以采用更小的指数偏移值(2的幂,这个幂越小,可以表示小数后面越多)。

可以通过IEEE 754 浮点数转换 - 锤子在线工具 (toolhelper.cn)   去玩一玩测一测。

2、瓦片加载优先级——computeTileLoadPriority

瓦片优先级跟两个参数相关,1)距离屏幕中心越远,加载优先级越低。2)瓦片距离眼睛的距离。

第一个与屏幕中心的夹角算法比较简单,就是tileDirection与cameraDirection的夹角。万万没想到,在瓦片加载中,第二点“瓦片距离眼睛的距离”却是复杂的狠啊。

第一步:更新瓦片的包围盒TileBoundingRegion,在这里会根据生成的Mesh信息、地形夸张等参数补充式计算。可见这段代码伤害不大,但给人一种计算量大的心里压力。

第二步:判断眼睛高度与瓦片最低高度、最高高度的差。并取该插值为瓦片最低高度、最高高度

第三步:判断TileBoundingRegion是否包含眼睛,如果是,计算的眼睛高度与瓦片最低高度、最高高度的最小值。如果不是,先计算眼睛与TileBoundingRegion东南西北四个平面的投影距离(可以理解为侧面),然后再累加眼睛高度与瓦片最低高度、最高高度的最小值。

下面这篇文章讨论的相关的话题

图:眼睛到TileBoundingRegion的距离


http://www.mrgr.cn/news/51849.html

相关文章:

  • 数据库->库的操作
  • The 48 bit pointer
  • 参加CSP-J/S 认证,要学多久C++才能达到获奖水平?
  • AI学习指南深度学习篇- 预训练模型的原理
  • 常用的网络配置命令
  • 揭秘提升3DMAX效率的6款必备神级插件!
  • 刷爆Leetcode Day2
  • PMP–知识卡片--项目生命周期与资源投入
  • EDA常见的拓扑结构
  • 2024软考网络工程师笔记 - 第5章.无线通信网
  • DP—子数组,子串系列 第一弹 -最大子数组和 -环形子数组的最大和 力扣
  • 程序指针简史
  • Golang | Leetcode Golang题解之第486题预测赢家
  • linux日志分割工具logorate快速验证配置是否有效
  • 图像中的融合
  • HTML 标签简写及全称
  • AI学习指南深度学习篇-预训练模型的类型
  • 【回顾一下AQS知识,关于公平锁与非公平锁】
  • Python 列表专题:列表包含自身导致无线循环
  • 【C++11入门】新特性总结之移动语义(右值、右值引用、std::move()...)