进行Hermite样条插值,这里是2D向量插值。
定义:
D3DXVECTOR2 *WINAPI D3DXVec2Hermite(
D3DXVECTOR2 *pOut,
CONST D3DXVECTOR2 *pV1,
CONST D3DXVECTOR2 *pT1,
CONST D3DXVECTOR2 *pV2,
CONST D3DXVECTOR2 *pT2,
FLOAT s
);
参数:
pOut
[in, out] 指向 D3DXVECTOR2 结构的操作结果。
pV1
[in] 指向 D3DXVECTOR2 结构的源点位置向量。
pT1
[in] 指向 D3DXVECTOR2 结构的切向量。
pV2
[in] 指向 D3DXVECTOR2 结构的源位置向量。
pT2
[in] 指向D3DXVECTOR2 结构的切向量。
s
[in] 权重系数,看说明。
返回值:
指向 D3DXVECTOR2 结构的Hermite样条插值。
说明:
D3DXVec2Hermite 函数用Hermite 进行从(positionA, tangentA) 到 (positionB, tangentB) 插值,Hermite插值是导数值个数相等的情况下的插值多项式及插值余项。
因为样条很方面平滑地连接进去,又平滑地连接出来。坡度主要是由Q(s)属性来决定:
Q(s) = As3 + Bs2 + Cs + D (并且 Q'(s) = 3As2 + 2Bs + C)
a) Q(0) = v1, so Q'(0) = t1
b) Q(1) = v2, so Q'(1) = t2
v1就是 pV1,v2就是pV2, t1是pT1, t2是pT2。
这些参数是用解出 A, B, C, D。
D = v1 (from a)
C = t1 (from a)
3A + 2B = t2 - t-1 (substituting for C)
A + B = v2 - v1 - t1 (substituting for C and D)
从上面算出A,B,C,D就可以写出Q(s)来。
A = 2v1 - 2v2 + t2 + t1
B = 3v2 - 3v1 - 2t1 - t2
C = t1
D = v1
然后就是:
Q(s) = (2v1 - 2v2 + t2 + t1)s3 + (3v2 - 3v1 - 2t1 - t2)s2 + t1s + v1.
//重新整理后:
Q(s) = (2s3 - 3s2 + 1)v1 + (-2s3 + 3s2)v2 + (s3 - 2s2 + s)t1 + (s3 - s2)t2.
Hermite插值在控制动画方面非常有用,因为它通过每个控制点,因为那些点就相当于每个关键帧,并且它是位置及切线已明确,所以你可以很方便匹配每段曲线的起点与终点创建C2连续的曲线。
函数返回值跟pOut 参数返回值是一样的。这样可以让函数D3DXVec2Hermite作为其它函数的参数使用。
函数信息:
Header |
d3dx9math.h |
Import library |
d3dx9.lib |
Minimum operating systems |
Windows 98 |