关键帧技术
基本概念
插值方法
- 线性插值
- 线性的位置变换
- 颜色——图像变形,RGB数值的线性变换
- 非线性插值
- 问题: t均匀增加,无法实现匀速曲线运动 ;不便于实现速度的控制
- 处理手段: **轨迹曲线 **
p
=
P
(
u
)
p=P(u)
p=P(u)+移动特性
s
=
F
(
t
)
s=F(t)
s=F(t)–>建立从时间t到对象坐标位置p的关系
详细解决方法
1、路径长度 s s s和路径方程参数(自变量) u u u的关系 s = S ( u ) → u = U ( s ) s=S(u) \rightarrow u=U(s) s=S(u)→u=U(s)
2、路径长度 s s s和时间 t t t的关系 s = F ( t ) s=F(t) s=F(t) 可采用求解解析式和求数值解(常用前向差分法)的方式
3、进一步控制曲线途经处的速度
前向差分法
本质:取足够小的一段,用直线段去近似曲线弧,再用点斜式求解对应的x值或y值
优点:易于实现, 直观且具有较高的计算速度
缺点:弧长以及参数会一定程度上引入误差
解决方法:在速度和精度之间做出权衡
- 实施超采样1,从而减小误差
- 采用高阶插值计算降低误差
速度控制
- 匀速运动
- 自定义
易入/易出
描述:对象从静止位置处加速运动并达到最大速度,最终减速运动至静止处
实现易入/易出移动控制特性的方法:
- 正弦插值(很少匀速)
- s = e a s e ( t ) = s i n ( t π − π / 2 + 1 ) 2 s=ease(t)=\frac{sin(t \pi -\pi/2+1)}{2} s=ease(t)=2sin(tπ−π/2+1)
- 运动方式:缓慢启动、加速、减速
- 由于斜率处于不断变化中,因而移动过程中呈现出加速或减速状态
- 很少呈现匀速状态
- 正弦片段+直线(匀速+变速)
- 一元三次多项式
- 利用一元三次多项式逼近: s = 2 t 3 + 3 t 2 s=2t^3+3t^2 s=2t3+3t2
- 缺点:未提供匀速的控制方式
- 匀加速
变形(morphing)
已知源对象和目标对象前提下,构造一系列中间对象,从而使得从源对象通过这些中间对象光滑变化到目标对象
- 图像变形:目标对象和源对象都是图像
- 图形变形:目标对象和源对象都是图形
- 对象形状变形:形状之间的转换操作——确定对象的关键形状;形状之间采用插值计算
基本思想
- 确定对象上每个点相对于局部坐标系统的坐标
- 对局部坐标系统实施变形操作
- 将对象上每个点重新映射到新的局部坐标系统
交溶技术(cross-dissolve)——淡入淡出
就是图像的线性插值,容易有重影
基于网格的图像变体技术
几何特征对齐
目标
- 设源图像为和目标图像分别为A和B,需要计算对于任意的实数t,t∈[0,1]所对应的中间帧图像M
- 当=0时,M=A; 当=1时,M=B;
- 当t从0匀速地变换到1时,中间帧图像M从图像A逐渐变换到B
算法
- 为源图像和目标图像建立在拓扑上的意义对应的四边形网格——通过标选特征点,并且特征点一一对应
- 连接特征点形成四边形网格,目标图像与源图像的四边形网格一一对应
- 中间帧图像的四边形内部点局部坐标 M i M_i Mi计算——参考投影变换,线性插值的方式——计算方法: M i j ( t ) = ( 1 − t ) A i j + t B i j M_{ij}(t)=(1-t)A_{ij}+tB_{ij} Mij(t)=(1−t)Aij+tBij
- 通过映射关系由 M i j M_{ij} Mij反推导出参数 ( u , v ) (u,v) (u,v),从而求得在源图像和目标图像对应该点的颜色和位置信息
- 利用线性插值获得
M
i
M_i
Mi点在中间帧的颜色值,计算公式如下
{ R M ( t ) = ( 1 − t ) R A + t R B G M ( t ) = ( 1 − t ) G A + t G B B M ( t ) = ( 1 − t ) B A + t B B , t ∈ [ 0 , 1 ] \begin{cases} R_M(t)=(1-t)R_A+tR_B\\ G_M(t)=(1-t)G_A+tG_B\\ B_M(t)=(1-t)B_A+tB_B \end{cases}, t \in [0,1] ⎩⎪⎨⎪⎧RM(t)=(1−t)RA+tRBGM(t)=(1−t)GA+tGBBM(t)=(1−t)BA+tBB,t∈[0,1]
- 基于网格的图像变体算法运算结果的质量取决于最初建立的源图像A和目标图像B的四边形网格的质量
- 四边形网格越精细,则变体结果的图像质量一般也越高
- 四边形网格应当包含图像的尖点和拐点等关键点
- 四边形网格一般要求是凸四边形,如果是凹四边形就划分为凸四边形
- 缺点:算法灵活性不够
自由变形(FFD)
基本思想:将需要变形的物体或物体的某部分嵌入到类似于泥巴或塑料的柔性体中,然后假设物体也是非常柔软的,会随着物体外围柔性体的变形而发生变形
物体对于网格的局部坐标不变
实现:
- 将物体全部或部分嵌入到网格
- 然后通过对网格的变形(即改变网格顶点的位置)控制物体的变形
grid
二维网格 ;lattice
三维网格
具体算法
二维
- 将图形嵌入到一个平行四边形中
- 将平行四边形沿边的方向划分为 m × n m\times n m×n个网格(又称控制网格, 顶点称为控制顶点)
- 移动控制顶点,网格发生形变,嵌入的物体也发生形变
设 网 格 外 围 轮 廓 平 行 四 边 形 的 四 个 顶 点 分 别 为 P 0 , 0 , P 0 , n , P m , n , P m , 0 P m , 0 − P 0 , 0 = m S = m ( S x S y ) P 0 , n − P 0 , 0 = n T = n ( T x T y ) P i , j = P 0 , 0 + i S + j T 令 S ^ = ( − S y S x ) , T ^ = ( − T y T x ) , 则 S ^ 与 S 相 互 垂 直 , T ^ 与 T 相 互 垂 直 , 所 以 对 于 网 格 内 任 意 一 点 Q 的 网 格 参 数 坐 标 系 为 : u = ( Q − P 0 , 0 ) ⋅ T ^ m S ⋅ T ^ , v = ( Q − P 0 , 0 ) ⋅ S ^ n T ⋅ S ^ , u ∈ [ 0 , 1 ] , v ∈ [ 0 , 1 ] 设网格外围轮廓平行四边形的四个顶点分别为P_{0,0},P_{0,n},P_{m,n},P_{m,0}\\ P_{m,0}-P_{0,0}= mS=m\left(\begin{matrix}S_x\\S_y\end{matrix}\right)\\ P_{0,n}-P_{0,0}=nT=n\left(\begin{matrix}T_x\\T_y\end{matrix}\right)\\ P_{i,j}=P_{0,0}+iS+jT\\ 令\hat S =\left(\begin{matrix}-S_y\\S_x\end{matrix}\right), \hat T=\left(\begin{matrix}-T_y\\T_x\end{matrix}\right),\\ 则\hat S与S相互垂直, \hat T与T相互垂直,\\ 所以对于网格内任意一点Q的网格参数坐标系为:\\ u=\frac{(Q-P_{0,0})\cdot \hat T }{m S \cdot \hat T},v=\frac{(Q-P_{0,0})\cdot \hat S}{n T \cdot \hat S},u \in [0,1] ,v \in [0,1] 设网格外围轮廓平行四边形的四个顶点分别为P0,0,P0,n,Pm,n,Pm,0Pm,0−P0,0=mS=m(SxSy)P0,n−P0,0=nT=n(TxTy)Pi,j=P0,0+iS+jT令S^=(−SySx),T^=(−TyTx),则S^与S相互垂直,T^与T相互垂直,所以对于网格内任意一点Q的网格参数坐标系为:u=mS⋅T^(Q−P0,0)⋅T^,v=nT⋅S^(Q−P0,0)⋅S^,u∈[0,1],v∈[0,1]
可借助如下图所示的坐标系推导上述公式
当移动网格控制点 P i , j P_{i,j} Pi,j时,网格发生变形,网格上点Q也随之发生变化,其对应的新坐标为:
Q ( u , v ) = ∑ i = 0 m ∑ j = 0 n p i , j B E Z i , m ( u ) B E Z j , n ( v ) 其 中 B E Z i , m ( u ) = C m i u i ( 1 − u ) m − i B E Z j , n ( u ) = C n j v j ( 1 − v ) n − j Q(u,v)=\sum^m_{i=0} \sum^n_{j=0} p_{i,j} BEZ_{i,m}(u)BEZ_{j,n}(v)\\ 其中BEZ_{i,m}(u) = C_m^i u^i(1-u)^{m-i}\\ \qquad BEZ_{j,n}(u)=C_n^j v^j (1-v)^{n-j} Q(u,v)=i=0∑mj=0∑npi,jBEZi,m(u)BEZj,n(v)其中BEZi,m(u)=Cmiui(1−u)m−iBEZj,n(u)=Cnjvj(1−v)n−j
三维
类似二维自由形变,将物体嵌入到平行六面体中,将六面体划分为
l
×
m
×
n
l \times m \times n
l×m×n
网格坐标
新坐标
白话就是用从更多的采样结果中采样,将多个采样点压缩成一个采样点 ↩︎