自学内容网 自学内容网

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的距离


原文地址:https://blog.csdn.net/htsitr2/article/details/142992597

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!