GameInput のフォース フィードバック
このトピックでは、GameInput
のフォース フィードバックがデバイスの出力を管理する方法について説明します。 フォース フィードバックでは、ゲーム入力デバイスが、1 つ以上のデバイスの入力コントロールを物理的に移動して、ユーザーに触覚的フィードバックを提供することができます。 フォース フィードバックは、駆動輪やフライト シミュレーション装置など、車両操作をシミュレートする入力デバイスで動作します。 これらのデバイスには、ある軸上でコントローラーに何らかの力を加えるフォース フィードバック モーターが含まれています。 レーシング ホイールでは、ゲーム内のシナリオをシミュレートするためにホイールを旋回する回転力です。 レバーを特定の位置から押したり引いたりするのが難しくなるように、操縦桿でフォース フィードバックを使います。
フォース フィードバックをサポートする GameInput
インターフェイスの詳細については、「IGameInputDevice」および「IGameInputForceFeedbackEffect」をご覧ください。
フォース フィードバック モーターについて確認する
フォース フィードバック効果を作成するには、効果を適用したい入力デバイスを表す IGameInputDevice インターフェイスが必要です。 IGameInputDevice
インターフェースを取得したら、GameInputDeviceInfo 構造体を調べることで、デバイス上のフォース フィードバック モーターの数を確認します。 これは、IGameInputDevice::GetDeviceInfo を呼び出して実行できます。 入力デバイスにフォース フィードバック モーターがある場合、GameInputDeviceInfo メンバー である ForceFeedbackMotorCount
は 1 以上の値を持ちます。
フォース フィードバック効果を作成する
デバイスの GameInputDeviceInfo 構造体が 1 つ以上のフォース フィードバック モーターを持っていることを示している場合、IGameInputDevice::CreateForceFeedbackEffect を呼び出すことで、そのデバイスのフォース フィードバック効果を作成します (次のコードに示します)。
HRESULT CreateForceFeedbackEffect(
uint32_t motorIndex,
const GameInputForceFeedbackParams* params,
IGameInputForceFeedbackEffect** effect
)
モーター インデックス パラメーターは、フォース フィードバックの影響を受けるモーターのインデックスです。 このインデックスは、GameInputDeviceInfo 構造体の GameInputForceFeedbackMotorInfo 配列内の適切なモーターに対応しています。 この配列には、存在しているフォース フィードバック モーターとその能力に関する情報が含まれています。
2 番目のパラメーターでは、効果の特徴を説明するフォース フィードバック効果用の GameInputForceFeedbackParams 構造体を作成します (次のコードに示します)。
typedef struct GameInputForceFeedbackParams {
GameInputForceFeedbackEffectKind kind;
union
{
GameInputForceFeedbackConstantParams constant;
GameInputForceFeedbackRampParams ramp;
GameInputForceFeedbackPeriodicParams sineWave;
GameInputForceFeedbackPeriodicParams squareWave;
GameInputForceFeedbackPeriodicParams triangleWave;
GameInputForceFeedbackPeriodicParams sawtoothUpWave;
GameInputForceFeedbackPeriodicParams sawtoothDownWave;
GameInputForceFeedbackConditionParams spring;
GameInputForceFeedbackConditionParams friction;
GameInputForceFeedbackConditionParams damper;
GameInputForceFeedbackConditionParams inertia;
};
}
GameInputForceFeedbackEffectKind 列挙型を選択し、対応する GameInputForceFeedbackParams
構造体を初期化します。
たとえば、スプリング動作でフィードバック効果を作成する場合、 GameInputForceFeedbackParams は GameInputForceFeedbackEffectKind の値 GameInputForceFeedbackSpring
およびスプリングの GameInputForceFeedbackConditionParams 構造体で構成されます。 選択した GameInputForceFeedbackEffectKind 列挙型のパラメーターを入力します。
フォース フィードバック モーター効果をインデックスで選択し、GameInputForceFeedbackParams 構造体を作成したら、IGameInputDevice::CreateForceFeedbackEffect を呼び出して効果を作成します。 これは IGameInputForceFeedbackEffect インターフェイスで表されます。
フォース フィードバック効果の有効期間は、作成された IGameInputForceFeedbackEffect インターフェイスに関連付けられます。 効果は作成されたときにデバイスに読み込まれます。 最後の参照が解除されると、フォース フィードバック効果が停止され、デバイスのモーターからアンロードされます。
フォース フィードバック効果の適用と更新
フォース フィードバック効果が作成されると、これがデバイスのモーターに直接ロードされます。 フォース フィードバック モーターのメモリー量には限りがあります。 これにより、同時にロードして再生できるフォース フィードバック効果の数が制限されます。 この上限に達した後に IGameInputDevice::CreateForceFeedbackEffect を呼び出すと関数はエラーを返します。
フォース フィードバック効果を作成すると、停止状態のフォース フィードバック モーターにロードされます。 ロードされた後、IGameInputForceFeedbackEffect インターフェイスを使って、効果の状態を Running
に設定します。 これによりデバイス モーターへの効果が再生されます。
フォース フィードバック効果の状態
フォース フィードバック効果は、ゲームの現在の状態に合わせて、いくつかの状態を移動します。 ゲームに合わせて効果の状態を更新したり、注目したりすることで、期待される動作を維持することが大切です。
フォース フィードバックの状態は、次のコードに示すように、GameInputFeedbackEffectState に応じて設定できます。
typedef enum GameInputFeedbackEffectState
{
GameInputFeedbackStopped = 0,
GameInputFeedbackRunning = 1,
GameInputFeedbackPaused = 2
} GameInputFeedbackEffectState
フォース フィードバック効果を作成した後、これは Stopped
の状態に変更されます。 新規または停止したフィードバック効果が Running
状態に設定されている場合、効果の最初から再生されます。 状態を Paused
に変更すると、フォース フィードバック効果がモーターに影響しなくなります。 ただし、Paused
状態の効果を Running
に設定すると、フォース フィードバック効果は中断位置に効果パターンを適用するようになります。
効果を停止すると効果は終了しますが、後でもう一度効果をトリガーすることができます。 たとえば、ユーザーがレーシング ゲームの大まかな変更を残した場合などです。 同様に、効果の停止は、ゲームプレイを変化させずに、ユーザーが一時停止メニューのような UI を移動する場合に便利です。
フォース フィードバック効果の状態を設定するには、IGameInputForceFeedbackEffect::SetState を呼び出します。
フォース フィードバック効果を更新する
新しい GameInputForceFeedbackParams 構造体が同じ GameInputForceFeedbackEffectKind 列挙型を共有している場合、フォース フィードバックのゲインを調整するまたは新しいパラメーターのセットを指定します。
ゲイン
次のコードに示すように、IGameInputForceFeedbackEffect::SetGain 関数を使用してゲインを調整することで、フォースフィードバック効果の強度を変更できます。
void SetGain(
float gain
)
ゲインは 0 から 1 の間の値をとることができます。 既定では、フォース フィードバック効果のゲインは 1 に設定されています。 この機能は主に効果の強度を緩和するために使用されます。
新しいパラメーターの設定
次のコードに示すように、IGameInputForceFeedbackEffect::SetParams 関数を使用して、フォース フィードバック効果の新しいパラメーターを指定します。
bool SetParams(
const GameInputForceFeedbackParams* params
)
この関数を使用してフォース フィードバック効果のパラメーターを置き換える場合、パラメーターを設定するフォース フィードバック効果と同じ GameInputForceFeedbackEffectKind 列挙型を使用します。 実行中の効果を停止することなく、すぐに新しいパラメーターが適用されます。 期間の値が変更 されない 場合、期間タイマーは更新されません。 これは、別の期間の値が指定されている場合、または効果が停止して再起動された場合にのみ更新されます。
実行中の効果を停止する場合、新しいパラメーターとともに再起動されます。 一部のゲームでは、GameInputForceFeedbackConstant
の GameInputForceFeedbackEffectKind 列挙型 によってフィードバック効果のパラメーターを設定して、異なるフィードバック パターンをシミュレートするためにパラメーターを変更できます。
GIP デバイスと HID デバイスの機能の違い
コンソールの場合、すべてのデバイスで GIP ドライバー モデルが使用されます。 PC の場合、デバイスによって GIP と HID のいずれかのドライバー モデルが使用されます。ベンダー ドライバーをインストールすると、通常はそれらが HID モードに変換されます (手動制御用の物理スイッチがない場合)。 HID デバイスのフォース フィードバック機能は、当初の設計時に対象となった DirectInput API の制約を受けます。 GameInput には、そのような制約を可能な限り回避する機能があります。 それでも、ある程度の違いは残ります。
HID デバイスの場合、ハードウェアで追加の軸がサポートされているかどうかに関係なく、現時点ではフォース フィードバックが AngularX 軸のみに制限されます。 これは、大半のレーシング ホイールを適切にサポートできる構成です。
HID フォース フィードバックは、現時点では 19H2 以降のバージョンの Windows で利用でき、今後の更新プログラムで 19H1 にも対応する予定です。