次の方法で共有


D3DXQuaternionSquadSetup

球状平方補間のコントロール ポイントを設定します。

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

パラメータ

  • pAOut
    AOut へのポインター
  • pBOut
    BOut へのポインター
  • pCOut
    COut へのポインター
  • pQ0
    入力コントロール ポイント Q0 へのポインター
  • pQ1
    入力コントロール ポイント Q1 へのポインター
  • pQ2
    入力コントロール ポイント Q2 へのポインター
  • pQ3
    入力コントロール ポイント Q3 へのポインター

戻り値

なし。

解説 

この関数は、4 つのコントロール ポイントを受け取ります。これらは、入力 pQ0、pQ1、pQ2、および pQ3 に提供されます。次に、これらの値を変更し、最短パスを通る曲線を見つけます。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 です。

まだ正規化されていない入力クオータニオンに対しては、すべて D3DXQuaternionNormalize 関数を使用します。

次の例では、一連のクオータニオン キー (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 または - Q2 となります。
  • Qt は、関数の結果です。

結果は、時間 = 0.5 での、y 軸を回転軸とした 45??の回転となります。

要件

ヘッダー: D3dx9math.h 宣言

ライブラリ: D3dx9.lib 内容

関連項目

D3DXQuaternionSquad