Unity 浮点数精度

  1. 引用
  2. 浮点精度
  3. 空间不是无限的
  4. 例子
  5. 我们可以利用缩小比例尺来获取更高的浮点精度吗?
  6. 缩小比例尺正确的用法
  7. 在大比例尺下相机会出现的问题

引用

https://zhuanlan.zhihu.com/p/349735060

https://thegamedev.guru/

浮点精度

    1. Unity允许你将对象放置在基于浮点数的坐标系限制内的任何位置。Transform的X,Y和Z的限制是7个有效数字,在这7个数字中的任何位置都可以保留小数;举个例子:你可以将对象放置在12345.67或12.34567的坐标点上.使用此系统,离原点(0.000000-绝对零)越远,浮点数精度越低。例如,假设一个单位(1u)等于一米(1m),则1.234567处的对象的浮点精度为6个小数位(微米),而76543.21处的对象只能有两个小数位(厘米)。随着距原点的距离越来越远,精度下降成为一个明显的问题。比如说由于精度的原因,你无法将765432.1处的对象移动0.01(一厘米)。
    1. 这看起来似乎不是一个大问题,但是物体在离原点太远时,在更大距离上失去浮点精度会导致诸如照相机抖动和不准确的物理现象。所以大多数游戏都试图将事物合理地保持在接近原点的位置,以避免这些问题。

空间不是无限的

    1. 如果在任何一个轴上放置的物体距离超过100000个单位,Unity虽然会发出警告,但仍然可以让你这样做。类似的,我能够插入Unity中的Transform的最大值是3e + 38,它是一个3,后面有38个零。尽管这是一个惊人的数字,但随着符号更改为1e + 07(一百万),浮点精度问题在99999999之后瞬间爆发,浮点精度会全部丢失,此时你所能做的唯一一件事就是控制第一位之后零的数量。
    1. 最好将浮点数保持在建议的最大值100000以下,以确保浮点精度至少达到小数点后一位。由于当浮点精度较低时,摄像机的运动和物理运算将变得不可靠 ,所以需要什么水平的浮点精度才能保持可接受的游戏体验,是对开发者的一个考验。

例子

    1. 一个 float 类型只有 7 位有效数字,包括小数点后面的以及小数点前面的,它的极端实例: 0.000009 9.999999 99.99999 999.9999 9999.999 99999.99 999999.9 9999999 这些值.所以当你使用任何浮点数时,要知道它的最大最小值.

我们可以利用缩小比例尺来获取更高的浮点精度吗?

    1. 缩小放大比例计算,不是解决问题的办法.因为 float 本身的精度只能支持 7 位有效数字.
    1. 限制使用是解决问题的好办法.

缩小比例尺正确的用法

    1. 地球与月球的距离有384,400,000米,已经超过 float 的精度,在 unity 引擎中表示 3.844e+08,这个是错误的数值,如果以 float 类型计算也不会得到正确的数据.只能去缩小其距离,变成最大 384,400,0 米 这样在float 精度内,可以缩放成 3844.000 米.

在大比例尺下相机会出现的问题

    1. Unity(以及大多数其他引擎)中的相机具有“近”和“远”裁剪平面,该平面定义了“视锥”。视锥范围内的所有内容都将被渲染,超出此范围的任何内容都不会渲染。
    1. 要渲染像苹果这样的小物体,你可能希望能够将摄像头尽量靠近物体,可能被近裁切平面裁切之前需要接近到1cm(0.01u)。如果将这两个值插入“摄像机”(near = 0.01,far = 100000)中,则会发现一些问题。首先,多边形在会出现Z-fight并开始相交并闪烁。产生这些异常的原因是使用如此大的摄像机视锥时缺少z-buffer(深度)精度造成的,基本上与我们在坐标系统上使用浮点精度时遇到的相同问题相同。
    1. 使用多相机来解决这个问题,Unity可以使用多个摄像按顺序把图像渲染到GamePlay视窗。最简单的方法是,我们可以在同一位置创建两个摄像机,然后将一个视锥的远近截面设置为0.01到1000,将第二个摄像头的远近截设置为1000到1000000。通过两个分层的摄像机渲染不同层级的物体(第一个渲染苹果,第二个渲染行星),这样,我们就可以同时看到近处和远处的物体,并克服了z-buffer深度限制。
    1. 大型场景的3D天空盒,一台供玩家使用,另一台相机用来拍摄巨大的风景物体(天空盒).要一些代码才能使3d skybox摄像机的相对位置和旋转与玩家摄像机在每个帧上的相对位置和旋转同步
    1. 将摄影机集中在原点,并让世界围绕着摄像机旋转。我们的“世界”有限的浮动空间仅用于渲染,世界中对象的实际坐标存储在更好的“自定义”系统中的其他位置(64位浮点数),并在每一帧上转换为世界空间坐标。使用缩放天空盒方案来解决遥远天体的显示问题。当玩家靠近这些对象时,它们会隐藏在天空盒中,并且会在与玩家互动的空间中添加实际大小的版本。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1487842110@qq.com

Love

Title:Unity 浮点数精度

文章字数:1.4k

Author:诸子百家-谁的天下?

Created At:2020-05-08, 11:41:32

Updated At:2021-03-28, 02:59:27

Url:http://yoursite.com/2020/05/08/Unity/Optimize/%E6%B5%AE%E7%82%B9%E6%95%B0%E7%B2%BE%E5%BA%A6/

Copyright: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

爱你,爱世人