D3DXQuaternionSquadSetup 関数 (D3DX10Math.h)
注意
D3DX10 ユーティリティ ライブラリは非推奨です。 代わりに DirectXMath を使用することをお勧めします。
球面四角形補間のコントロール ポイントを設定します。
構文
void D3DXQuaternionSquadSetup(
_In_ D3DXQUATERNION *pAOut,
_In_ D3DXQUATERNION *pBOut,
_In_ D3DXQUATERNION *pCOut,
_In_ const D3DXQUATERNION *pQ0,
_In_ const D3DXQUATERNION *pQ1,
_In_ const D3DXQUATERNION *pQ2,
_In_ const D3DXQUATERNION *pQ3
);
パラメーター
-
pAOut [in]
-
型: D3DXQUATERNION*
AOut へのポインター。
-
pBOut [in]
-
型: D3DXQUATERNION*
BOut へのポインター。
-
pCOut [in]
-
型: D3DXQUATERNION*
COut へのポインター。
-
pQ0 [in]
-
型: const D3DXQUATERNION*
入力制御ポイント Q0 へのポインター。
-
pQ1 [in]
-
型: const D3DXQUATERNION*
入力制御ポイント Q1 へのポインター。
-
pQ2 [in]
-
型: const D3DXQUATERNION*
入力制御ポイント Q2 へのポインター。
-
pQ3 [in]
-
型: const D3DXQUATERNION*
入力制御ポイント 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 です。
正規化されていない四元数入力には 、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 です。
- Qt は関数の結果です。
結果は、時間 = 0.5 の z 軸を中心に 45 度の回転になります。
要件
要件 | 値 |
---|---|
ヘッダー |
|
ライブラリ |
|
関連項目