Microsoft DirectX 8.0 (C++)

CPOINT の使い方

CPOINT 構造体を使って、デバイス軸の応答カーブのセグメントをキャリブレーションする。DIPROPCPOINTS 構造体を介して、最高 8 つの CPOINT を設定できる。各 CPOINT 構造体には、ジョイスティックの軸上の位置を示す未処理のデータと論理値が格納されている。アプリケーションが未処理のデータを受け取ると、論理値を使って、実際に使用される戻り値を計算する。指定された CPOINT 未処理データの値の範囲内にある未処理値は、CPOINT と値のいずれかの端とを結ぶ線に基づいて、論理値に補間される。

次に示すのは、ジョイスティックの X 軸の応答カーブに 5 つの CPOINT を適用した例である。DIPROPCPOINTS 構造体の適用前は、この例の軸に対する応答グラフは、飽和とデッド ゾーンを含めて以下のようになる。

DIPROPCPOINTS 構造体は、物理的範囲を -500 〜 500 とし、次のように初期化される。

DIPROPCPOINTS dipcp;

dipcp.diph.dwSize = sizeof(DIPROPCPOINTS); 
dipcp.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
dipcp.diph.dwObj = GUID_XAxis; 
dipcp.diph.dwHow = DIPH_BYID; 
dipcp.dwCPointsNum = 5; 
dipcp.cp[0].lP = -500
dipcp.cp[0].dwLog = 0
dipcp.cp[1].lP = -300
dipcp.cp[1].dwLog = 1000
dipcp.cp[2].lP = -100
dipcp.cp[2].dwLog = 5000
dipcp.cp[3].lP = 200
dipcp.cp[3].dwLog = 9000
dipcp.cp[4].lP = 500
dipcp.cp[4].dwLog = 10000

CPOINT 構造体の dwLog メンバの値は合計に対するパーセンテージ (全範囲内での個々の目盛りの数) として 10000 を乗算して表現されるため、実際の戻り値の最大値を知る必要はないことに注意する。たとえばこの例は、ジョイスティックの範囲を -300 ポイントとして、最大値の 10% が返されるカーブが設定されている。0.10 * 10000 = 1000 となり、この値は dwLog メンバに与えられ、対応する lP メンバには -300 が割り当てられる。

この DIPROPCPOINTS 構造体を IDirectInputDevice8::SetProperty で適用した後、カーブは次のように応答する。