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。 函式接著會改變這些值,以尋找沿著最短路徑流動的曲線。 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 度。

 

規格需求

需求
標頭
D3DX10Math.h
程式庫
D3DX10.lib

另請參閱

數學函式