cesium中精度问题

文章探讨了GIS引擎中GPU渲染场景的精度问题,特别是在使用float而非double时。提出了通过双精度转换为单精度、计算相对位置并针对不同距离优化的方法,以减小精度损失。
摘要由CSDN通过智能技术生成

        对于gis这种大坐标的引擎,精度问题是很关键的,特别是使用了gpu渲染场景,现在的gpu的精度都是float的,相较于double。

缺陷:

1、float是32位浮点数,布局是【1符号位+8指数位+23小数位】精度较低;

2、最大范围在cm级时为131072.00,也就是100公里的范围,相较于地球半径6,356,750米差的很远; 

        Float:比特数为32,有效数字为6-7,数值范围为 -3.4E+38 ~ 3.4E+38

        如何尽量消除上面的问题,对于基于gpu渲染的场景来说很重要;

        存在几种解决方法,参考文章1中,使用了RTC、RTE方式,这是一些常规的使用相对位置减少精度损失的方法,参考文章1中改进了RTE的方式,首先说明一下RTE就是目标位置相对于相机位置进行目标偏移,是以相机(或者眼睛)为中心的,下面主要关注这个方面。

        计算步骤如下:

        a、将目标位置P、和相机位置Q的double类型坐标转换成两个单精度float类型

                double(x,y,z)=高位double(x,y,z)+低位double(x,y,z),

void CDoubleToTwoFloats::Convert(double doubleValue,
    float& floatHigh, float& floatLow)
{
    if (doubleValue >= 0.0)
    {
        double doubleHigh = floor(doubleValue / 65536.0) * 65536.0;
        floatHigh = (float)doubleHigh;
        floatLow = (float)(doubleValue - doubleHigh);
    }
    else
    {
        double doubleHigh = floor(-doubleValue / 65536.0) * 65536.0;
        floatHigh = (float)-doubleHigh;
        floatLow = (float)(doubleValue + doubleHigh);
    }
}

       在将高位double(x,y,z)强转换转换成float类型时,低位丢失只留下高位,其中为什么要除以65536,而不是别的值呢,因为float值在cm级时是131072.00,是65536的2倍,但是由于计算机系统精度的不确定性(理论上是7位,实际6~9位,因为float的小数是使用泰勒级数的思想近似计算的,不能准确拟合出真实的值),所以选用了65536这个值。

        b、将目标位置P减去相机位置Q,计算出相对位置

uniform vec3 uViewerHigh;
uniform vec3 uViewerLow;

void main(void)
{
    vec3 highDifference = vec3(vPositionHigh.xyz - uViewerHigh);
    vec3 lowDifference = vec3(vPositionLow.xyz - uViewerLow);
    gl_Position = gl_ModelViewProjectionMatrix * vec4(highDifference + lowDifference, 1.0);
}

        目标位置和相机位置的高位、低位分别相减,计算出相对位置

      c、将上述相减的位置在相加就是关键

        分两种情况讨论:

        1、当相机和目标相对比较近(小于131072.00)时,它们的高位都是0,所以高位+低位=低位的结果;

        2、当相机的目标位置相对较远的时候(大于131072.00)时,相加后的结果中低位精度中的不精确值可以忽略。

        如上图所示精度不准确的位不会影响很大,因为距离很远,即使有点抖动也看不出来。

参考文章:

https://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm

c#:float存储原理(待续。。。)_c# float-CSDN博客

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 墨卡托投影是一种常用的地图投影方式,它是将地球表面的经纬度坐标系投影到平面上,常用于地图制作和导航等领域。 CESIUM是一种基于WebGL的三维地球可视化引擎,用于构建虚拟地球应用程序。在CESIUM使用墨卡托投影可以将地球表面的三维数据以墨卡托投影的形式投影到平面上进行呈现。这样可以大大降低数据计算的难度,同时也可以提高数据呈现效率和易用性。 在CESIUM,墨卡托投影是通过椭球体来实现的,具体地,在地球上选择一个主子午线(通常为本初子午线)作为心线,并将地球投影到以该心线为轴的椭球体上。这样,地球所有位置的地理坐标就可以被映射到平面上,然后再用三维建模和渲染技术来呈现。 总之,CESIUM使用墨卡托投影可以方便地将地面三维数据投影到平面上进行呈现,同时也提高了绘图效率和数据呈现的精度。 ### 回答2: Cesium是一个开源的WebGL地球呈现框架,可用于在Web浏览器构建具有全球覆盖的三维场景。Cesium支持多种椭球体,包括WGS84和其他地球模型。为了在二维屏幕上显示三维地理空间,Cesium使用投影转换,其一个地球表面点的经纬度(或其他坐标系统)被转化为平面2D坐标。 在Cesium,有多种种投影方式可用,包括Mercator(墨卡托)投影、Web Mercator投影、等面投影(Equal Area Projection)等。其,墨卡托投影是其之一,是一种非常普遍的投影方式。 墨卡托投影是一种圆柱形正射投影,该投影以赤道为基准,把地球表面划分为纬线和等间距的直线。墨卡托投影在导航、船舶和飞行模拟等方面非常有用,因为它可以保持方向和距离(相对于赤道),并且非常适合快速计算距离和角度。 在Cesium使用墨卡托投影,其实是因为在相应的应用场景比较适合使用。例如,Cesium在处理Web地图时,使用Web Mercator(也称为Web墨卡托投影)会更常见,因为它是Google Maps、Bing Maps和OpenStreetMap等在线地图服务的标准投影方式。 综上所述,Cesium可以使用墨卡托投影,也可以使用其他投影方式,具体要根据需要选择。当然,无论选择哪种投影方式,Cesium都为用户提供了丰富的API和工具,方便开发者快速、高效地创建三维地理空间应用程序。 ### 回答3: Cesium是一款基于WebGL的三维地球可视化引擎,它支持多种地图投影方式,其墨卡托投影是最常用的一种。 墨卡托投影是一种常见的投影方式,它把地球表面上的经纬度坐标转换为平面上的x、y坐标。在这种投影下,地球表面被分成一个网格,每个网格被映射到平面上的一个矩形区域。Cesium使用的墨卡托投影又被称为Web墨卡托投影,是一种对墨卡托投影进行优化的方式。 Cesium使用墨卡托投影的好处在于,它可以快速地将地球表面上的点转换为直角坐标系的点,以便用来计算物体相对位置、查询真实的地理位置等。此外,墨卡托投影还保留了地球表面的真实形状和比例尺,使得在Cesium呈现的地球表面更加真实和准确。 使用墨卡托投影还有一个显著的好处是可以加速数据的呈现和自定义流程。Cesium的3D场景需要大量的数据,包括地形、图层、3D模型、纹理等等,所有这些数据都必须被逐个加载,转换并重新生成才能在场景呈现。通过使用墨卡托投影,可以使这些数据的处理流程更快速、更准确,使得整个3D场景的操作更加流畅、更加自然。 总的来说,Cesium使用墨卡托投影可以提高数据的处理速度、提高场景的真实性和准确性,使得用户可以更加方便地使用和操作这款引擎。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值