Platform SDK: DirectX

条件

条件とは、デバイス内の現在のセンサ値に反応して適用されるフォースのことである。すなわち、条件は、ジョイスティック ハンドルの位置または速度など、デバイスに関する情報を必要とする。

一般的に、条件はゲームやその他のアプリケーションにおける個別のイベントには関連付けられていない。条件は、フライト スティックの硬さや緩さ、または直進の位置に戻すハンドルの向きなどの状態を表現する。

条件は、定義されたマグニチュードを持たない。マグニチュードは、入力オブジェクトの動作と位置によって測定される。

DirectInput は、次のような条件のエフェクトを定義する。

ほとんどのハードウェア デバイスでは、条件にエンベロープを適用できない。

条件には次のタイプのパラメータがある。

Offset
条件の適用が始まる適切なセンサ値を読み込む、ゼロからのオフセット。スプリング エフェクトでは、中立点 (スプリングが静止していると考えられる軸上の点) は条件用のこのオフセットによって定義される。ダンパ エフェクトでは、このオフセットにより、ダンパ フォースがゼロとなる最大速度値が定義される。通常、オフセットは慣性エフェクトや摩擦エフェクトには使用しない。
Coefficient
エフェクトのスケーリングを算出する乗数。デバイスによっては、条件に関係する軸上の正方向と負方向に別の係数を設定することができる。たとえば、攻撃を受けた飛行機をコントロールする操縦桿は、左よりも右へ動かす方が容易になるというような場合である。
Saturation
フォース フィードバックでは、飽和点はエフェクトを上げる最大のフォースを表している。たとえば、操縦桿が X 軸上でスプリング条件を持っていると仮定してみよう。オフセットはゼロ、係数は 10,000 であり、通常は操縦桿が中立点から最も離れているときに、最大フォースが発揮される。しかし、正負 5,000 の飽和点を定義していると、操縦桿が右や左に移動した後、フォースは増加しない。

飽和点をサポートしていないデバイスもある。

Deadband
デッドバンドとは、条件が作用しない軸のオフセット範囲のことである。スプリングが軸の中立点に静止している場合は、デッドバンドはこの静止の範囲を拡張する。

デッドバンドをサポートしていないデバイスもある。

条件に継続時間を設定することができる。しかし、継続時間を INFINITE (-1) に設定し、アプリケーションで特定のイベントに応答するときだけエフェクトを停止する方法が使用されることが多い。

[C++]

条件を生成するには、IDirectInputDevice7::CreateEffect メソッドの rguid パラメータに次の値のどれか 1 つを渡す。

DIEFFECTINFO 構造体のメンバ dwEffType (DIEFT_GETTYPE(dwEfftype)) の下位バイトが DIEFT_CONDITION に等しい場合は、IDirectInputDevice7::EnumEffects メソッドで取得したほかの任意の GUID を渡すことができる。この方法を使えば、業者が設計したハードウェア特有の条件を使用することができる。

条件のタイプ固有構造体は DICONDITION である。複数軸の条件では、1 つの軸に対して複数の構造体からなる配列を使用するか、または特定の方向での条件を定義する 1 つの構造体を使用することができる。どちらの場合でも、DIEFFECT 構造体の cbTypeSpecificParams メンバに、使用するバイト数を設定する必要がある。すなわち、sizeof(DICONDITION) * n を設定する必要がある。ここで n は使用する構造体の数を表す。1 つあるいは複数の構造体を使用する方法の情報は、DICONDITION 構造体についての「注意」を参照すること。

エフェクトの係数と飽和について正と負の両方がデバイスでサポートされているかどうかを確認するには、アプリケーションで IDirectInputDevice7::GetEffectInfo メソッドまたは IDirectInputDevice7::EnumEffects メソッドを呼び出し、DIEFFECTINFO 構造体の dwEffectType メンバを調べなければならない。エフェクトが DIEFT_POSNEGCOEFFICIENTS フラグを返さなければ、lNegativeCoefficient メンバの値は無視され、lPositiveCoefficient の値が軸全体に適用される。同様に、エフェクトが DIEFT_POSNEGSATURATION フラグを返さなければ、dwNegativeSaturation の値は無視され、dwPositiveSaturation の値が負の飽和レベルとして使用される。また、エフェクトが DIEFT_SATURATION フラグを返さなければ、dwPositiveSaturationdwNegativeSaturation の両方の値が無視され、飽和点は適用されない。

係数には負数を設定することができる。こうすると、エフェクトは反対方向のフォースを生成する。たとえばスプリング エフェクトでは、係数に負数を設定すると、スプリング エフェクトはオフセット点に向かって引っ張らずに、オフセット点から離れる方向へ押すことになる。

また、DIEFFECTINFO.dwEffectType に DIEFT_DEADBAND フラグが設定されているかどうかをチェックすることで、デッドバンドが条件に対してサポートされているかどうかを知ることができる。サポートされていない場合、DICONDITION 構造体の lDeadBand メンバの値は無視される。

[Visual Basic]

条件を生成するには、IDirectInputDevice7::CreateEffect メソッドの rguid パラメータ に次の値のどれか 1 つを渡す。

DirectInputEnumEffects.GetType により返された値の下位バイトが DIEFT_CONDITION に等しい場合は、DirectInputEnumEffects.GetEffectGuid メソッドで取得したほかの任意の GUID を渡すこともできる。この方法を使えば、業者が設計したハードウェア特有の条件を使用することができる。

条件のタイプ固有パラメータは、DIEFFECT 型の condition メンバに含まれる DICONDITION 型に記述される。

エフェクトの係数と飽和について正と負の両方がデバイスでサポートされているかどうかを確認するには、アプリケーションで DirectInputEnumEffects.GetType メソッドを呼び出し、返された値のメンバを調べる必要がある。エフェクトが DIEFT_POSNEGCOEFFICIENTS フラグを返さなければ、DICONDITION.lNegativeCoefficient の値は無視され、lPositiveCoefficient の値が軸全体に適用される。同様に、エフェクトが DIEFT_POSNEGSATURATION フラグを返さなければ、lNegativeSaturation の値は無視され、lPositiveSaturation の値が負の飽和レベルとして使用される。また、エフェクトが DIEFT_SATURATION フラグを返さなければ、lPositiveSaturationlNegativeSaturation の両方の値が無視され、飽和点は適用されない。

係数には負数を設定することができる。こうすると、エフェクトは反対方向のフォースを生成する。たとえばスプリング エフェクトでは、係数に負数を設定すると、スプリング エフェクトはオフセット点に向かって引っ張らずに、オフセット点から離れる方向へ押すことになる。

また、GetType メンバ に DIEFT_DEADBAND フラグが設定されているかどうかをチェックすることで、デッドバンドが条件に対してサポートされているかどうかを知ることができる。サポートされていない場合、DICONDITION 構造体の lDeadBand メンバの値は無視される。

単一軸エフェクトを生成するには、DIEFFECT 型の conditionX メンバまたは conditionY メンバに、未使用の軸に対する係数をゼロとして設定する。

DirectX for Visual Basic では、条件の回転をサポートしていない。