浅谈Unity3D中数据的归一化(-32767 ~ 32768

2018-12-19  本文已影响0人  望山跑死鹿

0、概念:归一化:

    1)把数据变成(0,1)或者(1,100)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

    2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

1、问题:从某硬件读取数据,值范围是 -32767 - 32768,但我需要的是0~1之间。

     1)先创建三个摇杆,值范围设置成 0 ~ 1,只是为了数据能看的更直观,不做其他用途。

     2)创建三个变量

      3)在Update中赋值,值来源于硬件,他的范围是 -32767 ~ 32768

      4)运行后,可以在面板中看到定义的三个公共变量,这是原始数据。

看得出来,硬件是汽车的踏板,分别为离合刹车和油门,我们暂且不管滑杆和下面的数值,只观察我们定义的变量,这组数据确实是 -32767 - 32768

      5)现在创建3个滑杆,值设置为 最小0,最大1 默认0,如下图所示

      6)我们在脚本中,引入UI的命名空间,然后创建三个滑杆

      7)将脚本挂在摄像机或其他活动物体上面

      8)将三个滑杆赋值给脚本,上列7个变量中,Input 为硬件的原始值,下面的三个是归一化后的值,而且也是滑杆的value

      9)关于归一化,有一个公式,范围是0-1:

           (1)Min-Max Normalization               value  =  ( originalValue - X_min) / (X_max - X_min)

               我们直接套用

                   gas(滑杆的Value) = (gasInput(硬件的原始值) +32767) / (32767 +32768);

                brake(滑杆的Value) = (brakeInput(硬件的原始值) +32767) / (32767 +32768);

               clutch(滑杆的Value) = (clutchInput(硬件的原始值) +32767) / (32767 +32768);

                   看起来和公式不太一样,那是因为我简化了写法

                   原来的写法:值 =( 硬件原始值  -  最小值 )   /  (最大值 - 最小值)

                   我们的最小值是-32767,最大值是32768,减去负数 那就是加正的(负负得正),所以就直接 +

      10)现在将计算出的value,赋值给滑杆,下面是完整代码,有了公式,思路就变得简单了

2、问题比较简单,在此记录一下,我也曾尝试过 Mathf.Clamp,但是我只能得到 最大数和最小数,并不能取中间。

3、不论是什么硬件,都会有数值传递,,那么如果数值不规律或者不是我们想要的,数据标准化或者归一化都是很有必要的。

上一篇下一篇

猜你喜欢

热点阅读