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 内容