エフェクトの方向
1 つ以上の軸に対して方向を定義できます。マウスやジョイスティックの場合と同様に、x 軸は左から右に向かって増加し、y 軸は遠くから近くに向かって増加します。
エフェクトの方向は、そのエフェクトが来る方向です。負の y 軸方向を持つエフェクトは、スティックを正の y 軸方向に (ユーザーに向かって) 押そうとします。ユーザーがスティックを左に押してエフェクトを打ち消す必要がある場合、そのエフェクトの方向は左、つまり、負の x 軸上にあります。
方向は、極座標、球座標、またはデカルト座標で表現できます。
極座標は、エフェクトに対して設定された任意のゼロポイント (真北) からの時計回りの角度を 100 倍した 1 つの角度で表現されます。通常、このポイントは負の y 軸、つまり、ユーザーから離れる方向です。したがって、極座標 9,000 のエフェクトは、東の方向、つまり、ユーザーの右の方向を持ち、ユーザーはこのエフェクトを打ち消すために右に力を加える必要があります。
球座標も角度の 100 倍で表現されますが、2 つ以上の角度を持つことができます。それぞれの角度を次の軸の正方向に回転したものが方向になります。3D デバイスの場合、最初の角度は通常正の x 軸から正の y 軸 (東から時計回り) に向かって回転し、2 番目の角度は正の z 軸 (下) に向かって回転します。したがって、方向が (0, 0) のフォースは、ユーザーの右でテーブル面と平行な方向の力です。最初の角度が 27,000 で 2 番目の角度が 4,500 の方向は、ユーザーからまっすぐ遠ざかり (東から時計回りに 270 度)、かつ床 (テーブル面から 45 度下) に向けて傾斜した方向であり、この方向を持つフォースを打ち消すには、ユーザーは向こう側に押しながら下方向に押す必要があります。
デカルト座標は 3D ベクトルと同様です。グラフ用紙の中心を原点 (0, 0) として直線を書く場合、直線の方向は原点からの距離に関係なく、その線が交わる任意の交点の座標によって定義できます。(1, - 2) の方向と (5, - 10) の方向はまったく同じです。
注 フォース フィードバック エフェクトの作成に使用される座標では、方向のみが定義され、マグニチュードや距離は定義されません。
エフェクトを作成または変更するときには、DIEFFECT 構造体の cAxes、rgdwAxes、rglDirection の各メンバーがフォースの方向指定に使用されます。
cAxes メンバーは、エフェクトに関連する軸の数を指定します。この数は、その次の 2 つのメンバーによって指される各配列の要素数でもあります。
rgdwAxes によって指される配列は、エフェクトが適用される軸を識別します。DIEFF_OBJECTOFFSETS フラグが設定されている場合、軸はデータ フォーマットの構造体内のオフセットで識別されます。これらのオフセットは、DIJOFS_* 定義を使用することにより、簡単に識別できます(これらの値のリストについては、「ジョイスティック デバイス定数」を参照してください)。
最後の rglDirection メンバーは、フォースの方向を指定します。
注 cAxes および rgdwAxes メンバーは、いったん設定したら変更することはできません。エフェクトは、常に同じ軸リストを持ちます。
デカルト座標、極座標、球座標のどれを使用しているかに関係なく、rgdwAxes で指される配列内に存在する軸数と同じ数の要素を rglDirection に指定する必要があります。
極座標系では、北 (0 度) はベクトル (0, - 1) にあります。このベクトルの各要素は、rgdwAxes で指される軸リスト内の要素に対応します。通常、これらの軸は x と y であるため、北は負の y 軸にまっすぐ沿った方向、つまり、ユーザーから離れる方向です。rglDirection の最後の要素は 0 である必要があります。
エフェクトの作成 の例では、2 次元フォースの方向が極座標で定義されています。このフォースの方向は南、つまり、このフォースはユーザーの方向から来るため、これを打ち消すにはユーザーはスティックを手前に引く必要があります。この方向は、北から時計回りに 180 度であり、次のように割り当てることができます。
LONG lDirection[2] = { 18000, 0 };
さらに明確に、この割り当ては次のようにも表現できます。
LONG lDirection[2] = { 180 * DI_DEGREES, 0 };
球座標では、3 軸のデバイスを操作していると仮定した場合に、同じ方向は次のように割り当てられます。
LONG lDirection[3] = { 90 * DI_DEGREES, 0, 0 }
最初の角度は (1, 0) の方向から (0, 1) の方向に回転した角度の 100 倍で測定され、2 番目の角度は (0, 0, 1) の方向に向かう角度の 100 倍で測定されます。ベクトル表記の各要素は、この場合も、rgdwAxes メンバーで指される配列の要素に対応します。この配列の要素が、順に x、y、および z 軸を表すと仮定します。原点は、x = 1 および y = 0 で、ユーザーの右です。回転の方向は、正の y 軸 (0, 1) の方向です。つまり、ユーザーに向かう時計回りの方向です。この例のフォースは右から時計回りに 90 度、つまり南です。lDirection の 2 番目の要素は 0 であるため、3 番目の軸に対する回転はありません。
デカルト座標で同じことをする場合はどうなるでしょうか。dwFlags メンバーで DIEFF_CARTESIAN フラグを使用したと仮定した場合、この方向は次のように指定されます。
LONG lDirection[2] = { 0, 1 };
ここでも、この配列の各要素は rgdwAxes で指される配列にリストされた軸に対応します。この例では、x 軸を 0、y 軸を 1 に設定しています。これは、正の y 軸にまっすぐ沿った方向、つまり南です。
エフェクトの方向の理論は理解しにくいかもしれませんが、実際にやってみると簡単です。
エフェクトの方向設定の例
単一軸エフェクト
単一軸エフェクトの方向の設定は、指定するものがないため簡単です。DIEFFECT 構造体の dwFlags メンバーに DIEFF_CARTESIAN フラグを設定し、rglDirection が値 0 を格納した 1 つの LONG を指すように設定します。
次のコード例は、x 軸エフェクトの方向と軸のパラメーターを設定しています。
DIEFFECT eff;
LONG lZero = 0; // No direction
DWORD dwAxis = DIJOFS_X; // X-axis effect
ZeroMemory(&eff, sizeof(eff));
eff.cAxes = 1; // One axis
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; // Flags
eff.rglDirection = &lZero; // Direction
eff.rgdwAxes = &dwAxis; // Axis for effect
極座標を使用した 2 軸エフェクト
極座標の 2 軸エフェクトの方向の設定は、少しだけ複雑です。dwFlags に DIEFF_POLAR フラグを設定し、rglDirection が 2 つの LONG から成る配列を指すようにします。この配列の最初の要素はエフェクトが来る方向です。配列の 2 番目の要素は 0 にする必要があります。
次の例は、東から来る 2 軸エフェクトの方向と軸のパラメーターを設定しています。
DIEFFECT eff;
LONG rglDirection[2] = { 90 * DI_DEGREES, 0 };
DWORD rgdwAxes[2] = { DIJOFS_X, DIJOFS_Y }; // X- and y-axis
ZeroMemory(&eff, sizeof(eff));
eff.cAxes = 2; // Two axes
eff.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS; // Flags
eff.rglDirection = rglDirection; // Direction
eff.rgdwAxes = rgdwAxes; // Axis for effect
デカルト座標を使用した 2 軸エフェクト
デカルト座標の 2 軸エフェクトの方向の設定には、少し注意が必要です。dwFlags に DIEFF_CARTESIAN フラグを設定し、この場合も rglDirection が 2 つの LONG から成る配列を指すようにします。今回は、配列の最初の要素が方向ベクトルの x 座標になり、2 番目の要素が y 座標になります。
次のコード例は、東から来る 2 軸エフェクトの方向と軸のパラメーターを設定しています。
DIEFFECT eff;
LONG rglDirection[2] = { 1, 0 }; // Positive x = east
DWORD rgdwAxes[2] = { DIJOFS_X, DIJOFS_Y }; // X- and y-axis
ZeroMemory(&eff, sizeof(eff));
eff.cAxes = 2; // Two axes
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; // Flags
eff.rglDirection = rglDirection; // Direction
eff.rgdwAxes = rgdwAxes; // Axis for effect