谈谈工作中的低层运动控制方法吧。动画师设计动画时一般先设计好物体的运动轨迹,然后指定物体沿该轨迹的运动。物体的运动轨迹为样条曲线,由用户交互给出。
假设物体的运动轨迹为一空间参数曲线Q(u),我们必须对Q(u)等间隔采样,以求得物体在每一帧的位置。但是,当对参数u等间隔采样时,并不能得到样条曲线上的等间隔采样,因为等间距的参数不一定对应等间距的弧长。由于弧长函数s=A(u)是u的严格增函数,因此s和u是一对一的关系。A(u)是一个积分方程,它没有解析解。我们无法直接将A
-1(s)解析表达出来,通常只能采用数值求解的方法。此方法在《Advanced Animation and Rendering Techniques》中有详细说明,此书作者Watt还根据他们的实践提出了一种基于向前差分的近似计算方法,这在算法中均以实现。而我们的轨迹用什么样条的类型来表示呢?计算机辅助几何设计中常用的样条函数有Bezier、B样条、β样条,各有优缺点吧。 B样条是动画中较常用的曲线之一,其二阶连续性保证了运动的光滑性,局部性保证了可对动画进行局部调整,因此非常适合于作轨迹曲线,但并不太适合关键帧插值。在Hermite函数基础上Kochanek将两个附加参数引入到约束方程中,得到的样条函数非常适合关键帧插值系统。
具体的Hermite样条函数很多有讲解,只列出入切矢量和出切矢量的一般公式:
张量参数 t用来控制曲线在插值点处的尖锐性;偏移量参数b用来调整源弦和目标弦的相对权值;连续性参数c来控制左右切向的大小。利用这三个参数非常适合于指定曲线的形状调整。
关于位置插值曲线的设计:
class Spline
{
public:
Spline();
virtual ~Spline();
public:
void