Platform SDK: DirectX |
1 つまたはそれ以上の軸に対して方向を定義することができる。マウスとジョイスティックの場合と同様に、x 軸は左から右へと増加し、y 軸は遠くから近くへと増加する。3 次元デバイスでは、z 軸は上方から下方へと増加する。
エフェクトの方向は、エフェクトが来る方向である。y 軸の負側に沿った方向でのエフェクトは、スティックを y 軸の正側に沿って (ユーザーに向かって) 押そうとする。方向の軸値を視覚的にとらえるには、ユーザーがデバイスに反対に作用する力を加えているところを想像してみればよい。エフェクトを打ち消すためにユーザーがスティックを左方向に押さなければならない場合、このエフェクトは「左」方向である。つまり、このエフェクトは x 軸の負側にある。
方向は "極" 座標、"球面" 座標、または、"デカルト" 座標で表すことができる。
極座標は、エフェクトに対して設定されたゼロ地点 (真北) から時計回りに、実角度の 100 倍の単一角度で表される。通常これは負側の y 軸、すなわち、ユーザーから遠ざかる方向である。したがって、極座標 9,000 のエフェクトは通常、東の方向つまりユーザーの右側の方向を持つ。このエフェクトを打ち消すには、ユーザーは右側へ力を加えなければならない。
球面座標も実角度の 100 倍で表されるが、2 つまたはそれ以上の角度を含むことがある。それぞれの角度について、方向は次の軸の正方向に回転する。3 次元デバイスの場合は、第 1 の角度は、通常正側の x 軸から正側の y 軸に向かって (東から時計回りに) 回転し、第 2 の角度は正側の z 軸に向かって (下方へ) 回転する。したがって、方向が (0, 0) のフォースはユーザーの右側の方向であり、机面と平行になる。第 1 の角度が 27,000 で第 2 の角度が 4,500 の方向とは、ユーザーからまっすぐに離れながら (東から時計回りに 270 度)、床に向かう (机面から下方へ 45 度の角度) 方向である。この方向のフォースを打ち消すには、前方へ押し出しながら下方へ押し下げなくてはならない。
デカルト座標は 3 次元ベクトルに似ている。中心を始点 (0,0) とするグラフ用紙に直線を引くと、その直線の方向は、始点からの距離とは関係なく、直線が通る任意の座標により定義することができる。したがって、方向 (1, -2) と方向 (5, -10) はまったく同じものとなる。
注 : フォース フィードバック エフェクトの生成に使用する座標は方向のみを定義し、マグニチュードや距離は定義しない。
エフェクトを生成または変更するときは、DIEFFECT 構造体の cAxes、rgdwAxes、および rglDirection メンバを使用して、フォースの方向を指定する。
cAxes メンバは、次に続く 2 つのメンバが指す配列の要素の数を指示するだけである。
rgdwAxes が指す配列により、軸が識別される。DIEFF_OBJECTOFFSETS フラグが設定されていれば、軸はデータ形式構造体内のオフセットによって指定される。これらのオフセットは DIJOFS_* を使って非常に簡単に指定される (これらの値については、「ジョイスティック デバイス定数」を参照すること。
最後に、rglDirection メンバはフォースの方向を指定する。
注 : cAxes および rgdwAxes メンバは一度設定すると、変更することはできない。エフェクトは常に同一の軸リストを持つ。
デカルト座標、極座標、球面座標のどれを使用する場合でも、rgdwAxes が指す配列にある軸の数とまったく同じ数の要素を rglDirection に用意しなければならない。
極座標システムでは、「北 (ゼロ度)」はベクトル (0, -1) 上にあり、このベクトルの要素は rgdwAxes が指す軸リストの要素に対応する。通常はこれらの軸は x と y なので、北はそのまま y 軸の負側の方向になる。すなわち、ユーザーから離れる方向になる。rglDirection の最後の要素はゼロでなければならない。
「エフェクトの生成」での例では、2 次元フォースの方向は極座標で定義される。この例ではフォースは南方向、すなわちユーザーの方向から来ているので、ユーザーがフォースを打ち消すにはスティックを手前に引き寄せなくてはならない。南の方向は北から時計回りに 180 度であり、次のように割り当てることができる
LONG lDirection[2] = { 18000, 0 };
より明確にするために、割り当ては次のように表すこともできる。
LONG lDirection[2] = { 180 * DI_DEGREES, 0 };
球面座標については、3 軸デバイスで作業していると仮定した場合、同じ方向は次のように割り当てられる。
LONG lDirection[3] = { 90 * DI_DEGREES, 0, 0 }
DIEFFECT 構造体では、第 1 の角度は、方向 (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] = { 1, 0 };
繰り返すが、この配列の要素は rgdwAxes が指す配列にリストされている軸に対応している。この例では x 軸にゼロを設定し、y 軸に 1 を設定している。すなわち、方向は直接 y 軸の正側上、または南にある。
エフェクトの方向についての理論は、理解するのは難しいかもしれないが、実践してみればかなり容易に理解できる。サンプル コードがあるので、「エフェクト方向設定の実例」を参照すること。
DirectX for Visual Basic は、x 軸と y 軸での 2 軸エフェクトをサポートしている。
エフェクトの方向は、エフェクトが来る方向である。y 軸の負側に沿った方向でのエフェクトは、スティックを y 軸の正側に沿って (ユーザーに向かって) 押そうとする。方向の軸値を視覚的にとらえるには、ユーザーがデバイスに反対に作用する力を加えているところを想像してみればよい。エフェクトを打ち消すためにユーザーがスティックを左方向に押さなければならない場合、このエフェクトは「左」方向である。つまり、このエフェクトは x 軸の負側にある。
方向は "極" 座標、"球面" 座標、または、"デカルト" 座標で表すことができる。デフォルトでは、極座標が使用される。方向は DIEFFECT 型の x メンバに指定される。この場合、y メンバは常にゼロである。デカルト座標を使用するには、lFlags メンバの DIEFF_CARTESIAN を指定して、x と y の両方を指定する必要がある。
極座標は、エフェクトに対して設定されたゼロ地点 (真北) から時計回りに、実角度の 100 倍の単一角度で表される。通常これは負側の y 軸、すなわち、ユーザーから遠ざかる方向である。したがって、極座標 9,000 のエフェクトは通常、東の方向つまりユーザーの右側の方向を持つ。このエフェクトを打ち消すには、ユーザーは右側へ力を加えなければならない。
デカルト座標は 3 次元ベクトルに似ており、3 次元環境においてフォースをユーザーの方向設定に一致させる場合に非常に便利である。中心を始点 (0,0) とするグラフ用紙に直線を引くと、その直線の方向は、始点からの距離とは関係なく、直線が通る任意の座標により定義することができる。したがって、方向 (1, -2) と方向 (5, -10) はまったく同じものとなる。
注 : フォース フィードバック エフェクトの生成に使用する座標は方向のみを定義し、マグニチュードや距離は定義しない。
次のコードは、DirectInputEffect オブジェクトの dieff で表されるフォースの方向を反転する例である。dieff は、グローバル DIEFFECT 型の effectinfo を使って作成済みである。
effectinfo.lFlags = DIEFF_CARTESIAN effectinfo.X = effectinfo.X * -1 effectinfo.Y = effectinfo.Y * -1 Call dieff.SetParameters(effectinfo, DIEP_DIRECTION)
DirectX for Visual Basic は、条件による方向設定をサポートしていない。