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