解讀模擬搖桿原理及實驗
Interpreting Analog Sticks
當游戲支持控制器時,玩家可能會一直使用模擬搖桿。在整個體驗過程中,釘住輸入處理可能會對質量產生重大影響。讓來看一些核心概念以及INVERSUS的示例。
檢查
在調整模擬搖桿之前,需要了解其工作原理。當移動搖桿時,實際報告的硬件是什么?這是INVERSUS的搖桿檢查的樣子。並不是說這是最好的顯示方式,但是所有傳達的信息都很重要。
在詳細介紹每個部分之前,讓給出一個高層次的概述。正在使用連接到PC的Xbox 360控制器。第一行代表左桿上的加工階段。最下面一行是右搖桿。會注意到,第一行比第二行顯示的數據更多。這是因為INVERSUS僅使用左搖桿,並且得到了特殊處理。只會從聽到的角度談論最上面的那一行,但是對於使用游戲,一切仍然適用於正確的方法。
硬件抽象
前兩個圓圈表示從特定硬件(例如Xbox 360控制器或DualShock 4控制器)轉換為公共輸入空間的操作。不同的硬件是不同的。機械上有所不同,感覺也有所不同。可以說這是一個顯而易見的事實,但可能沒有考慮過。
假設在游戲機A上開發游戲,然后將其移植到游戲機B。需要保持原始調整的質量。如果模擬搖桿的行為不同,則會感覺有些不舒服。這個想法是將x,y值從受支持的硬件空間轉換成一個公共游戲空間。現在可以將游戲層調整為與控制器類型無關。
徑向死區
第一階段代表徑向死區處理。由於結構上的限制或使用中的磨損,硬件可能報告不良值。此階段從游戲中刪除了所述不可靠的值。
那么在看什么呢?紅色正方形用左下角的(-1,-1)和右上角的(1,1)限制坐標系。沿X軸和Y軸分為四個象限。鮮紅色的圓圈是單位圓圈。這些准則在以下每個階段均保持不變。
小綠色圓圈是輸入值。因為這是第一步,所以這些是直接形成硬件的原始值。綠色軌跡顯示通過線段連接的輸入(綠色點)的最新歷史記錄。白色小圓圈是該階段的已處理輸出。
在此階段獨特的是,還有兩個圓圈:內部死區和外部死區。
內部徑向死區
內圓內的值不能被信任。這是內部死區。在圖像中,正在不經任何阻力的區域輕輕移動棍子。此處不會將棍子拉回到死點。隨着管制員的年齡和虐待,該地區將增長,轉移和扭曲。
內部死區中的每個值都映射為零,從而為提供了可靠的游戲邏輯起點。會注意到白色輸出圓圈始終保持鎖定在中心。如果內部死區太緊,則當棒移到外面時運動可能會漂移。
硬件供應商通常會提供建議的內部死區值。這是一個不錯的起點,但是應該在盡可能多的控制器上進行自己的測試。這些推薦值可能並不完美,使用硬數據進行驗證也不會受到損害。
徑向外死區
外圈外的值不能被信任。這是外部死區。大多數游戲在內部死區方面都可以接受,但是由於外部死區較差(或不存在),可能會發現錯誤。
在第一個圖像中,將操縱桿筆直向上移動到頂部邊緣,然后圍繞邊緣逆時針滑動。在頂部,報告單位圓上或單位圓之外的值。生活並不完美,這是可以預期的。但是,當向左滾動棒時,實際上會在單位圓內切開一點,然后再向后伸出。此行為並非對所有控制器類型都通用,但是在Xbox 360控制器上可能會發生。
根據這些數據,可能會認為左側不准確,但並非如此簡單。在第二張圖片中,首先將操縱桿直接向左移動。在這種情況下,將按預期報告。只有將其旋轉一圈后,才能看到錯誤。
如果錯誤僅在旋轉之后發生,那么有多重要?根據游戲的不同,可能非常重要。想象一個游戲,搖桿的大小控制着玩家的速度。如果玩家角色向上移動並向左傾斜,則將在最大速度下稍稍移動,直到釋放並再次伸出手柄為止。
外死區之外的每個值都按比例縮放為1。這為游戲邏輯創建了一個可靠的單位圈。請注意,輸出(白色圓圈)保持鎖定到邊緣。
不幸的是,外部死區可能沒有任何推薦值。再次執行自己的測試並可視化數據。插入一堆控制器,看看如何反應。游戲需要考慮的復雜動作之后可能會有細微的錯誤。
徑向死區插值
在內部和外部值分別捕捉為零和一的情況下,如何處理中間值?為了避免任何不連續性,對比例進行線性插值。產生的邏輯可能看起來像這樣:
幅度重映射
已經剔除了不良值,需要將結果數據調整為一種普通感覺。許多因素影響為什么結果在不同類型的控制器上可能會有所不同。首先,有不同的徑向死區在起作用。第二,物理棒在不同的角度可以具有不同的阻力。第三,棍棒的形狀可能不同:棍棒處於不同的高度會導致拇指產生不同的扭矩。最后,並不總是位於控制器上的同一位置。
通過用曲線重新映射幅度,可以感覺 像推桿50%或75%都能 報告一致的輸出,而與硬件無關。將永遠無法獲得如此完美的體驗,但總比什么都不做要更好。
在INVERSUS的情況下,Xbox 360控制器是基准,因此重映射曲線僅為(輸出=輸入)或(y = x)。該曲線作為對角線覆蓋在圖像上。曲線的輸入(幅度)呈現為在屏幕上滾動的垂直線。該線在輸出值處與曲線相交。在這種特定情況下,輸入和輸出是相等的,但是對於備用控制器,使用三次樣條使感覺更像Xbox 360控制器。
稍后,將進行另一個曲線重映射以及一個顯示非平凡曲線的示例。
形狀重映射
如今,此步驟已不是必需的操作,實際上不支持INVERSUS,但想提一提。有時,控制器是使用不會輸出值圈的硬件開發的。可能在正方形中輸出某些內容,或者誰知道什么。在這種情況下,需要做一些額外的預處理,以將空間重新映射到起點。可視化數據,查看發生了什么,並采取相應的措施。
PC並發症
在跳出硬件抽象層之前,想討論PC游戲特有的復雜性。任何時候使用PC硬件-無論是用於圖形,音頻還是輸入-事情都比控制台復雜一個數量級。在控制器輸入的情況下,實際上並沒有那么遙遠。希望不久的將來可以刪除此部分。
問題的症結在於, XInput不會告訴是否插入了Xbox 360控制器或Xbox One控制器。不知道為此提供任何支持的接口(並且對聽到其方法非常感興趣)從任何已經解決人)。這導致多個問題。首先,無法從開始/返回到查看/菜單之類的操作來自動調整按鈕圖標。其次,無法在不同的控制器類型之間重新映射振動強度。第三(與本文更相關),不能自動調整徑向死區。
在輸入保真度方面,Xbox One控制器是更好的設備。不需要360控制器的較大外部盲區。不幸的是,在不知道連接哪一個的情況下,最好的選擇是將Xbox One控制器限制在Xbox 360的死區中。
如果對對降低PC駭客攻擊的想法不感興趣,可以跳至下一部分。否則,這是目前對如何解決INVERSUS(手指交叉)的想法。
最初考慮過使用Windows Raw Input和HID API “重寫” XInput 。從設備讀取數據並不難。為燈光和電機發送數據會比較棘手,但可行。不幸的是,XBox 360控制器被構建為不適合作為HID設備使用。模擬觸發器不能獨立讀取。認為這樣做是為了提升XInput,但老實說不確定。
后來考慮繞過HID接口並直接與USB通訊。認為這意味着要編寫驅動程序。覺得這太過分了。甚至可能達到無法向用戶隱藏的程度。
最近,想到了一個新主意。實際上還沒有實現,這有點瘋狂,但是確實擁有所有數據來使之成為可能[UPDATE:這完全可行]。可以使用原始輸入來識別已連接的Xbox 360和Xbox One控制器。也可以使用Raw Input從控制器接收HID輸入數據。通過將原始輸入的數據子集與XInput的數據(例如按鈕按下和模擬搖桿)進行比較,可以將設備從一個系統映射到另一個系統。這應該允許對XInput使用的控制器進行分類。從理論上講,這在舊版本的XInput中也將起作用,因此支持舊版本的Windows。
游戲意圖
已經清理了數據並將其放入游戲可以處理的公共空間。從這里開始到每個游戲的細節可能會變化,但是INVERSUS使用的階段適用於大多數游戲。還應該提到,具有多個上下文的游戲(例如,上下車)可能會根據上下文切換設置。
角死區
玩家會嘗試指向通用和特定的方向。對於INVERSUS,玩家在顯示器的二維平面內移動。通常嘗試直接向右或直接向上移動。在矩形屏幕上的2D游戲中,可以輕松查看垂直和水平對齊方式。與離開左側5度角相比,玩家更有可能嘗試並准確地直接向左側行走。因此,做到這一點應該很容易。
通過定義一組由角度死區限制的方向來處理此問題。在此區域中時,輸出將直接映射到指定方向。在圖像中,有四個盲區:上,下,左和右。當輸入(綠色圓圈)處於盲區時,輸出(白色圓圈)被鎖定到相應的軸。類似於徑向死區,可以平滑地內插每個相鄰死區之間的角度。輸出(白色圓圈)在移動時不會彈出。請注意,此操作需要首先轉換為極坐標。對角度值進行運算后,可以轉換回笛卡爾坐標。
還可以根據到原點的距離,用曲線調整盲區的角寬度。如果想更輕松地進行細微的軸向運動,可以彎曲死角,使死角在中心變寬。
將針對角度死區提到其一些用例,因為可能並不明顯。3D游戲導航怎么樣?對於攝像機的相對運動,玩家通常會嘗試移入/移出攝像機,或左右移動。這適用於第三人稱和第一人稱場景。3D相機控制怎么樣?在第三人稱和第一人稱游戲中,通常使用橫向搖桿動作來轉動角色。玩家不想在此過程中稍微上下移動相機。使容易。類似的邏輯適用於直視或直視。最后,讓討論一下可能需要更簡單設置的情況。在駕駛游戲中,玩家經常希望准確地向前或向后行駛。頂部的死區和底部的死區可能就足夠了。
靈敏度重新映射
這與用於硬件幅度重映射曲線的操作相同。還使用相同的調試渲染。被拆分,以便可以以與硬件無關的方式來調整游戲的感覺。不需要為每種受支持的控制器類型重做工作。
這條曲線的形狀是特定於游戲的,但是很可能從低處開始並向上彎曲。這將使更多的靈敏度移至搖桿的外部,從而更易於進行調整。此曲線的細微變化在游戲的玩法中可能具有驚人的重要作用。值得撥出一些堅實的時間進行迭代。
在INVERSUS的情況下,曲線比大多數游戲可能想要的要陡一些。這是因為不同的移動速度對游戲設計有多大用處。還在曲線的開頭添加了另一個細微差別。立即上升非常快。此調整特定於游戲物理的工作方式。決定在該點下的輸出對播放器沒有用,想充分利用輸入范圍,所以不會浪費任何東西。
最終輸出
最終顯示屏顯示完全處理過的膠棒值。在這里,可以驗證是否能夠達到游戲所需的期望方向和幅度。如果運行良好,可以開始在角色物理領域進一步調優。就是說,對於游戲而言,這可能不是終點。不斷詢問可以做些什么來改善體驗。
了解翻譯
並排渲染所有階段可全面了解輸入管道。這有助於假設調整並驗證結果。玩家通過控制器的語言與游戲對話,翻譯可能會很混亂。需要 通過此模糊翻譯步驟來幫助指導 特定意圖。如果可以進行准確的翻譯,則可以制作一個嚴格的控制游戲。