※ 引述《ts00139161 (Freedom)》之銘言:
: 最近在玩一個FPS 調整設定的時候有兩個設定一直看不懂
: 原文是inner deadzone size 跟 outer deadzone size
: 不知道有沒有大大知道這個設定是在調整甚麼的
: 拿去GOOGLE也看不太懂他的意思QQ
這是用來把類比搖桿輸入資訊的誤差和雜訊濾掉的選項
是個通用概念,不儘限於FPS
幾乎每個遊戲都會用dead zone,只差有沒有開放讓玩家調整的選項
假設理想類比搖桿 置中位置座標為(0, 0)
正左為(-1, 0) 正右為(1, 0) 正下為(0, -1) 正上為(0, 1)
硬體不可能是完美的
搖桿置中的時候,可能傳給主機的座標是(0.043, -0.027),加上微小的類比雜訊
要是不忽略這種小誤差和雜訊
有些遊戲就會當作使用者有輸入,出現角色或游標自己飄移的線項
把inner dead zone size調大,就是叫遊戲忽略較大的(0, 0)周邊雜訊
搖桿要是維持在inner dead zone內,遊戲收到的訊號就一直是(0, 0)
另外,搖桿推到最右邊,基於硬體的不完美性,有可能得到的座標是(0.9, 0)
導致角色或游標有可能無法以最高速度移動
調整outer dead zone size,可以叫遊戲把進入範圍內的訊號重新定義為1
像是超過0.85之後相當於1
這樣的話就算搖桿只能推到產生0.9的訊號,遊戲也將其會視為1
理想上inner dead zone要調成比置中誤差稍微大一點
outer dead zone要調成比搖桿轉一圈能夠達到的座標離原點的最小距離小一點
介於兩個dead zone之間的值,會用某種內插方式正規化
讓被修正過後的訊號仍然保持連續變動性
如果遊戲採用線性內插,那算式和程式就大概長這樣:
// 輸入方向 (為精簡,在此忽略零向量特例)
inputDirection = Normalize(inputVector);
// 輸入量
inputMagnitude = Magnitude(inputVector);
// 線性內插算新輸入量
newMagnitude =
(inputMagnitude - innerDeadZone) / (outerDeadZone - innerDeadZone);
// 把新輸入量限制在[0, 1]之間
newMagnittude = Clamp(newMagnitude, 0, 1);
// 新輸入向量為 新輸入量 乘以 輸入方向
newInputVector = newMagnitude * inputDirection;