首 页 | 博 客 | 试读下载 | 读者反馈 | 在校学生特惠申请 | QQ群: 308861655

关于地球级别地形渲染在单精度浮点下所造成的精度丢失解决办法?


#1

对于精度丢失所造成的抖动和模型错误等问题。
我在网上查找过几个关于此问题的解决方案。
https://www.zhihu.com/question/26538198
对于知乎给出的坐标转换法,”所有位置信息都以角色位置为中心做一次转换“的方法不是太明白。
难道是实际位置信息以双精度保存转换到以观察点为中心坐标后在放大整体地形然后在以单精度渲染吗?如果不放大坐标的话,实际位置信息之间的精度也没有发生变化那么怎么会防止精度丢失呢?

望能解答


#2

渲染体位置描述
以球面坐标,经纬高描述场景节点位置;
以地心为原点,建立笛卡尔坐标系(双精度);
经纬高和地心笛卡尔坐标能够转换;
通过场景节点的位置姿态描述渲染体位置姿态;
渲染体自身坐标通过浮点型组织;

渲染体渲染坐标变换
随着相机的运动,动态变换世界坐标系原点;
计算原则是,当前帧相机位置与当前世界坐标系原点距离超过10000米,将当前相机位置设置为世界坐标系原点;


#3

首先要明白精度是如何丢失的:
精度丢失的原因其实在于 float 的“浮点”,所谓浮点即根据当前值所表示的大小来动态适应精度,float num 可以表示为: 整数.小数,那么在有限的存储空间内,整数部分越大,小数部分的精度自然就变小。所以精度丢失的根源就在于 世界坐标系下坐标 xyz整数部分取值过大。
解决方案:
充分利用 model view matrix矩阵,将世界坐标系下的坐标直接转换为相机坐标系下的坐标。这样由于摄像机距离你要观察的物体自然状态下距离不会很大,那么就保证了坐标整数部分在一个可以接受的范围之内,小数部分的精度自然也就上去了。
那么这么做的本质的原理是什么呢?
本质就在矩阵中的位移。。。项目中可以再CPU端用double来计算 model view matrix,此时,“摄像机相对于世界坐标原点”的位移 与 ”模型空间相对于世界原点” 的位移可以大部分被抵消。换句话说,模型顶点位置可以直接变换到摄像机坐标系下位置,从而绕开了 “世界坐标系”造成的巨大的取值范围。然而这个“绕过”操作已经在CPU端用double来解决了。。
所以,综上:
一般我们在项目中的做法是:用模型坐标系下的顶点坐标 M_p + 模型坐标系 model matrix来描述三维物体坐标信息。进而计算 modelView matrix ,用 V_p = modelViewMatrix * M_p 来做渲染计算等操作。