次の方法で共有


D3DXQuaternionSquadSetup 関数

D3DXQuaternionSquadSetup 関数

球面二次補間の制御ポイントを設定する。

構文

void D3DXQuaternionSquadSetup(      
    D3DXQUATERNION *pAOut,
    D3DXQUATERNION *pBOut,
    D3DXQUATERNION *pCOut,
    const D3DXQUATERNION *pQ0,
    const D3DXQUATERNION *pQ1,
    const D3DXQUATERNION *pQ2,
    const D3DXQUATERNION *pQ3
);

パラメータ

  • pAOut
    [out] AOut へのポインタ。
  • pBOut
    [out] BOut へのポインタ。
  • pCOut
    [out] COut へのポインタ。
  • pQ0
    [in] 入力制御ポイント Q0 へのポインタ。
  • pQ1
    [in] 入力制御ポイント Q1 へのポインタ。
  • pQ2
    [in] 入力制御ポイント Q2 へのポインタ。
  • pQ3
    [in] 入力制御ポイント Q3 へのポインタ。

戻り値

注意

この関数は、入力 pQ0、pQ1、pQ2、および pQ3 に指定される 4 つの制御ポイントを取る。その後これらの値を変更して、最短のパスを通るカーブを見つける。q0、q2、および q3 の値は、次のように計算される。

q0 = |Q0 + Q1| < |Q0 - Q1| ? -Q0 : Q0
q2 = |Q1 + Q2| < |Q1 - Q2| ? -Q2 : Q2
q3 = |Q2 + Q3| < |Q2 - Q3| ?-Q3 :Q3

新しい Q 値を計算したら、次のようにして AOut、BOut、および COut が計算される。

AOut = q1 * e[-0.25 *( Ln[Exp(q1)*q2] + Ln[Exp(q1)*q0] ) ]

BOut = q2 * e[-0.25 *( Ln[Exp(q2)*q3] + Ln[Exp(q2)*q1] ) ]

COut = q2

  Ln はアプリケーション プログラミング インターフェイス (API) のメソッド D3DXQuaternionLn で、Exp は API のメソッド D3DXQuaternionExp である。

次に、クォータニオン キーのセット (Q0、Q1、Q2、Q3) を使って内部平方ポイント (A、B、C) を計算する例を示す。これにより、隣接するセグメントをまたいで接線が連続する。

        A     B
  Q0    Q1    Q2    Q3

このようにして Q1 とQ2 の間を補間する。

// Rotation about the z-axis
D3DXQUATERNION Q0 = D3DXQUATERNION(0,  0, 0.707f, -.707f);
D3DXQUATERNION Q1 = D3DXQUATERNION(0,  0, 0.000f, 1.000f);
D3DXQUATERNION Q2 = D3DXQUATERNION(0,  0, 0.707f, 0.707f);
D3DXQUATERNION Q3 = D3DXQUATERNION(0,  0, 1.000f, 0.000f);
D3DXQUATERNION A, B, C, Qt;
FLOAT time = 0.5f;

D3DXQuaternionSquadSetup(&A, &B, &C, &Q0, &Q1, &Q2, &Q3);
D3DXQuaternionSquad(&Qt, &Q1, &A, &B, &C, time);

注 :

  • C は、関数の結果によって + または - の Q2 となる。
  • Qt は関数の結果である。

結果は、z 軸の周りで time = 0.5 で 45 度回転したものになる。

関数の情報

ヘッダー d3dx9math.h
インポート ライブラリ d3dx9.lib
最低限のオペレーティング システム Windows 98

参照

D3DXQuaternionSquad