Contents

运动混合

对于游戏中的运动,我们可以较为统一的定义成四维空间(x,y,z,t)中的一条曲线。其通常拥有参数方程$P(x(t),y(t),z(t),t)$的形式。表示空间中某点位置(x,y,z)由参数t决定,而t则一般匀速增长,恰好对应现实中时间的增长。

游戏中运动的效果实际都是由这么一条曲线展现给玩家。而对于某个物体的运动,有些时候其可以拆解成多条运动的叠加效果。例如

$$P=P_1+P_2$$

当$P_1,P_2$都是连续的时候,我们可以简单判断出$P$也会是空间中一条连续的运动曲线。但是$P_1,P_2$的形式可能很简单,但是$P$的运行状态可能很复杂。而这就是运动混合,叠加所带来的效果。即一个混合运动轨迹可以表示为

$$P=F(P_1,P_2,\cdots,P_n)$$

F表示一个混合函数,他决定了这些基础运动轨迹如何形成我们最终的轨迹效果。本文章主要就是研究函数F所产生的混合叠加效果。

当一个物体的运动轨迹可以分解成某个运动轨迹$P_i$时,我们称该物体拥有运动状态$P_i$。而对于一个复杂运动状态分解成多个子状态,实际则是复杂的。

运动的叠加效果

运动中,最常见的效果就是运动叠加效果。例如一个物体有一个向前运动状态$P_1$,同时又拥有一个向右的运动状态$P_2$。那么物体最终会按照两个运动轨迹叠加起来的形状运动。例如上述例子中有:$P=P_1+P_2$,其运动叠加效果如下。

此时如果将运动方程中的系数进行归一化,我们可以得到如下的运动叠加方式:

$$ P=a_1P_1+a_2P_2+\cdots+a_nP_n\\ a_1+a_2+\cdots+a_n=1 $$

这个时候我们可以发现。对于确定的时刻t实际上P落在了由$P_1,P_2,\cdots,P_n$构成的仿射平面上。在只有两个点的情况下,很好理解,就是两个点的连线上面。$a_1,1-a_1$确定了在这条连线上的位置关系。当存在多个点的时候可以认为是依次连线后逐个确认插值点。

单需要注意的是,此时这些运动曲线实际表示,运动作用在这个物体上之后的运动效果。所以一般都是有相同的开始点。

过渡混合

所谓过渡混合可以认为此时运动从一个对象的运动模式,切换到另一个物体的运动模式上面,最简单的依旧是线性插值模式。即

$$P=(1-t)P_1(t)+tP_2(t),t\in[0,1]$$

当t为0的时候在$P_1$曲线位置,t为1的时候在$P_2$曲线位置。而随着时间的增长会逐渐从$P_1$过渡到$P_2$运动状态。显然当$P_1(t),P_2(t)$都是点的时候就是线性插值。

如果$P_1$为一个运动曲线。我们可以轻松得出,对于每一个时间t,$q_1(t)$实际上决定了一个点。而当前所在位置为该点和$P_2$点连线插值为t的位置上。其运动轨迹大致如下:

如果$P_1,P_2$都是一个运动曲线。其对应也是一致的,但是其语义则是从运动状态曲线$P_1$过渡到运动状态$P_2$上面去。

与样条曲线的关系

其实显然这个运动的过程是跟样条曲线是有所关联的。对于Bezier样条曲线来说,众所周知,其实际是有数个控制点之间依次插值的方式来实现的。而上述运动过程实际上恰好对应了这个关系。只不过对于插值的不再是一个固定的点,而是一条运动的曲线。

实际上对于上面运动混合的例子。如果$P_1,P_2$首尾相接,可以看出,实际上此时曲线就会是由三个点控制的Bezier曲线。其运动效果如下:

因为在这个过程中实际的运动方程如下:

$$ P=(1-t)P_1(t)+tP_2(t)=(1-t)[(1-t)p_1+tp_2]+t[(1-t)p_2+tp_3]=(1-t)^2p_1+2t(1-t)p_2+t^2p_3 $$

这个实际上就是由$p_1,p_2,p_3$三个点控制的Bezier曲线,当然这种关系来自于Bezier混合函数。对于N阶的Bezier运动曲线,其有递归关系:

$$BEZ_{k_n}(u)=(1-u)BEZ_{k,n}(u)+uBEZ_{k_1,n_1}(u)$$

但是也可以明显看到,当两个运动物体中运动规律不重叠的时候并没有这种确定的对应关系。

曲线控制点移动