【计算机动画】路径控制
为什么需要路径控制呢
大概就是确定一个角色比较基础的一个属性-位置和时间的关系
当呈现一部动画的时候帧肯定是连续的。但是在具体制作的时候往往先确定关键帧。
比如原画师和动画师干的活不一样= = 原画师在画完主镜后,要交给动画师画中间的分格动作。主镜确定了的话大概的趋势就确定了
然后想象flash里的关键帧……他会自动生成关键帧中间普通帧的具体位置,也差不多是这个概念。
第一次整资料的时候写了如上话然后第二天就发现有问题(摔)主要是受到轨迹生成的一些概念的影响(这个下面还会提到)
记不记得高中做实验的时候一个小球往下调然后相机piapiapia的连续成像……间隔时间会是相同的然后就可以算算重力势能算算动能了……
但这里是不一样的!(拍黑板)
像画一个车的运动图(俯视图)的时候(快想象快想象),往往会考虑在复杂的转弯啊这种地方多画几张,如果是一个匀速运动的直线的话只要几张有代表性的图就可以了。
所以说,实际情况下,我们拿到那一堆图的时候,靠脑补一个画面的画师并不能给你具体的(这一张是在第几秒)之类的信息。
然后想要得到更加丰富生动连续的运动图像,我们需要做的是
1. 根据已有的位置补充完整运动的轨迹,这样可以确定没有直接表现出来的其他点的位置。
2. 判断轨迹和时间的关系
但其实讲道理想要做到2至少还需要一个速度时间函数(或许还有比例尺?)
# 1 中间位置插值
对于这里一个很麻烦的概念就是,在做插值的时候,我们一直简单的认为**点之间的时间差是相同的**。
带着这个概念进入第二部分的时候,就会无法理解(为什么要重新确定轨迹和时间的关系)并且确定出来的时间差是不一样的。
所以记住这只是一个简化……
所以这大概是为什么我在第一次写这一篇的时候,感觉有很多无法理解的地方。前辈们在给出这些式子的时候,应该也有一部分建立在经验的基础上,这是我现在还无法理解的。
所以不删去那些思考和推导……{}中间是推不出合理结果的部分,然后淡灰色框里的部分是我后面加的评价
## 直线路径
### 线性插值
这种插值方法认为物体在两点之间以直线运动、
所以这种情况下生成的曲线如果在二维平面内会有明显的拐点,比较适合对于一维运动的拟合
P(u)=(1−u)∗P0+u∗P1P(u)=[u1]∗[−1110]∗[P0P1]
{
这里的law是对于匀速加速减速一种可以通用的处理而不单单是只对于线性插值有效,在第二部分可以看到这个law的定义类似于u
对于匀速加速减速的处理
⎧⎩⎨等速:law=t;加速:law=(1−cos(PI∗t/2));减速:law=sin(PI∗t/2);for(t=0,t<=1,t=t+δt){xin=(1−law)∗x0+law∗x1,yin=(1−law)∗y0+law∗y1
这意味着啥= =
这对law的定义其实是确定了一种分段的方法,从某种程度上统一了对加速减速的定义,使得在初始值和加速度变化情况不确定的时候能够表示这种运动。
并且如果分段确定是,比如5段,那么所有用到的law就是4种不需要重复去计算。
}
{
这一部分其实应该是[0,4]区间内用一个完整的正弦函数去拟的而不是分段,就是说现在的图[0,1]之间是比较符合实际应用的情况的图
然后看看具体情况= =
y=x2 可以认为加速度恒定;y=x3 可以认为是加速度线性变化的情况


大概在高速运动情况下误差会比较大吧-)
}
这里老师提到的一点是,(其实计算机动画不需要完全的物理真实)
## 曲线路径
### Hermite Spline
已知信息:始末点,始末点速度
基本形式:三次多项式
为啥用三次多项式呢 -
对于二次多项式来说,加速度是恒定的
三次多项式,加速度的变化是线性的
四次的话,变化肯定更加优雅- -但是五个系数需要五个方程才能确定,也就是说对于一个点需要(位置、速度、加速度)也就是(原函数、一次两次导数)。确定点的速度还是可以尽量准确的的确定点的加速度就很难说了、
然后Hermite Spline的公式可以用
⎧⎩⎨⎪⎪⎪⎪⎪⎪F(0)=PiF(1)=Pi+1F(0)′=Pi′F(1)′=Pi+1′
推出来
Pi′=1/2∗(Pi+1−Pi−1)
至于这个是否准确要看速度变化……速度变换是连续的情况下这个值是趋向于准确的。Pi′=τ∗(Pi+1−Pi−1)
(下图是从Hermite Spline到 Cardinal spline的推导过程)P0′=1/2∗(P1−(P2−P1)−P)0)=1/2∗(2∗P1−P2−P0)
{
为啥可以这么确定呢- -把x=t,y=t2 带进去不对啊
要我求的话、P1−P0 代表P1.5′ , P1−P0 代表P0.5′
然后求出来P0′=1/2∗(4∗P1−3∗P0−P2)
s=A(u)
v−t 曲线可以推导出
s=M(t)
然后大概就可以确定P(t) 了(装作)
s=A(u)
这里提醒一下P(u) 是个向量
s=A(u)=∫u0|dP⃗ du|du
(我终于记得加了个向量符)
就,高中一直折磨我的路径和位移的关系……u=A−1(s)
(就是那么悲伤……s=M(t)=∫t0|v|dt
t→s→u→P⃗
大概就是这个思路……
Catmull-Rom Spline
这是一种确定速度也就是,
这个的思路就是,用
至于这个是否准确要看速度变化……速度变换是连续的情况下这个值是趋向于准确的。
Cardinal spline
这个就是对于之前的速度的一个修正
(下图是从Hermite Spline到 Cardinal spline的推导过程)
{
宝宝没懂为什么能这么乱来 - -
这要是分段趋向于零的时候,岂不是速度有个突变= =
}
首尾点赋值
因为他们边上只有一个点(比较寂寞)所以无法用
所以这俩点需要特殊处理
一种处理方法是:
{
为啥可以这么确定呢- -把
要我求的话、
然后求出来
然后还是不知道它的式子哪来的orz
}
2 时间确定
现在呢经过第一部分已经知道了样条曲线
然后大概就可以确定
那就一步一步来- -
曲线路径弧长参数化计算
1
前面说的
这里提醒一下
(我终于记得加了个向量符)
就,高中一直折磨我的路径和位移的关系……
然后求积分的时候用到了Simpson公式
Simpson是二阶的(不过实际上我们的曲线是三阶的)
这个具体就不讲了=- = 打公式好烦
在整个路径的时候会是一个分段函数然后要对每一段单独应用这样子
2
你以为结束了吗……我们推出了
然后你就会发现求解的时候需要的是
(就是那么悲伤……
然后这个的处理方法异常简单粗暴——二分法,对于给定的s直接求……
最后一步啦
然后就可以
大概就是这个思路……