D3DXQuaternionSquadSetup 函式 (D3dx9math.h)
注意
D3DX 公用程式程式庫已被取代。 建議您改用 DirectXMath 。
設定球面四邊形插補的控制點。
語法
void D3DXQuaternionSquadSetup(
_Out_ D3DXQUATERNION *pAOut,
_Out_ D3DXQUATERNION *pBOut,
_Out_ D3DXQUATERNION *pCOut,
_In_ const D3DXQUATERNION *pQ0,
_In_ const D3DXQUATERNION *pQ1,
_In_ const D3DXQUATERNION *pQ2,
_In_ const D3DXQUATERNION *pQ3
);
參數
-
pAOut [out]
-
類型: D3DXQUATERNION*
AOut 的指標。
-
pBOut [out]
-
類型: D3DXQUATERNION*
BOut 的指標。
-
pCOut [out]
-
類型: 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。 函式接著會改變這些值,以尋找沿著最短路徑流動的曲線。 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 度。
規格需求
需求 | 值 |
---|---|
標頭 |
|
程式庫 |
|
另請參閱