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
);

parameters

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 度。

 

要求

要求
标头
D3dx9math.h

D3dx9.lib

另请参阅

数学函数

D3DXQuaternionSquad