私は、モーション入力を応答性の高い正確なマウス入力に変換するソフトウェアを開発するとともに、開発者が同等に優れたソリューションを実装するのを支援するWebサイトを維持しています。私は通常、動きのしきい値に対してはお勧めしませんが、プレーヤーがどの程度の応答性と正確さを求めるかによって異なりますが、状況に応じて問題なく機能することをうれしく思います。しかし、ここでは別のソリューションを提供します。
私はSoft Tiered Smoothingと呼ばれるものを使用しています。アイデアは、ジャイロ速度の現在の大きさに応じて、さまざまなスムージングアルゴリズムを介して入力をそらすというものです(実際には、これらのスムージングアルゴリズムの1つは、単に「スムージングなし」です)。それが「階層化された」部分です。「ソフト」な部分は、2つのしきい値との比較方法に応じて、入力をさまざまな平滑化アルゴリズム間でスムーズに分割できることです。
ディスプレイスメントを正しく保持し、速い動きに遅れを与えません。
実際には、2つのしきい値があります。入力速度の大きさが下限しきい値よりも小さい場合は、単純な平滑化アルゴリズム(複数のフレームにわたる平均)を使用しています。それが他のしきい値よりも大きい場合、平滑化アルゴリズムはまったく使用されません。ただし、この場合でも、下限しきい値の平滑化アルゴリズムにゼロを渡します。
入力速度が2つのしきい値の間にある場合、それに応じて2つのアルゴリズム間で入力を分割します。
上記の記事の抜粋を以下に示します。
GetSoftTieredSmoothedInput(Vec2 input, float threshold1, float threshold2) {
// this will be length(input) for vectors
float inputMagnitude = Abs(input);
float directWeight = (inputMagnitude - threshold1) / (threshold2 - threshold1);
directWeight = clamp(directWeight, 0, 1);
return GetDirectInput(input * directWeight) +
GetSmoothedInput(input * (1.0 - directWeight));
}
GetDirectInputは与えられたものを返すだけですが、ここでは別の平滑化アルゴリズムを使用できることを示しています。GetSmoothedInputは速度を受け取り、平滑化された速度を返します。
ソフトティアードスムージングでは、明らかに意図的な動き(大きいしきい値を超える)にはスムージングが適用されず、少量のジッターをカバーするためにスムージングが適用されます。これは、非常に小さい動きにも影響しますが、しきい値を正しく設定すると、それほど大きくありません。目立つ。そして、2つの間に非常にスムーズな移行があります(これがなければ、ジッターは実際に増幅されます)。
他の答えは、入力を受け取った瞬間にジッターを認識するのは難しいと言うのは正しいですが、ジッターはほとんど常に非常に低速であり、平滑化に伴う入力遅延は低速の入力でははるかに目立たないことも事実です。
記事で述べているように、これは、私のオープンソースツールJoyShockMapperのいくつかの場所で使用されています。これは、ジャイロ入力をマウス入力に変換する入力マッパーです。SteamやreWASDなどの他の再マッピングツールを使用している人でも、ジャイロコントロールのためだけにJoyShockMapperを同時に使用する人もいます。
この答えは、絶対的な向き(Razer Hydraが提供しているように聞こえる)ではなく、角速度(モーションコントロールを備えたコントローラーで一般的)で入力が与えられることを前提としています。絶対方向では、現在の方向と以前に報告された方向の差を使用して速度を取得できることを願っていますが、それが機能するかどうか、および角速度を自己報告するコントローラーで動作するかどうかはわかりません。
速度ではなく絶対位置/方向を扱う場合の一般的な平滑化ソリューションは、時間の経過とともに目標の方向に向かって補間することです。これは、このGamasutraの記事で非常に役立つ詳細に説明されています。これは、ソフトティアードスムージングでも機能します。この入力と以前に報告された入力との差を使用して、速度の大きさを計算します。このフレームと最後のフレームの向きの違いに、上記のスニペットで計算された「directWeight」値を掛けた値を適用します。最後のステップは平滑化された入力を追加することですが、補間された方向の平滑化が機能する方法のため、補間された方向の変更を通常どおりに適用するだけです。「directWeight」を考慮する必要はまったくありません。目標の方向(これは、Gamasutraの記事で説明されているスムージングで補間する方向です)をデバイスから取得する方向に設定し、その記事で説明されているように方向を補間します。