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
);
parameters
-
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 度。
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|
另请参阅