关节动画
基本概念
关节 – 如果两个刚体互相连接且能够发生相对运动,则这两个刚体的关联部分称为关节
关节链 – 将一系列依次相连的刚体通过关节连接而成的开链
末端影响器 – 关节链的自由末端(End effector)
关节链结构的自由度(Degree of freedom - DOF) – 状态空间的维 度,完全确定关节链结构状态所需的独立变量个数
正向运动学(direct/forward kinematics)
研究如何从给定的状态向量计算各个链杆的位置(包括各个关节的位置),尤其是末端影响器的位置
𝜃1,𝜃2和𝜃3之间相互独立,因此三 链杆关节链状态空间的维度为3
三链杆关节链末端影响器位置坐标:
逆向运动学(inverse kinematics)
解析法
逆向动力学是一种目标驱动技术,即研究如何从末端位置计算状态向量的位置
动画设计者只需要控制末端位置, 而不需要控制整个关节链结构, 系统求解满足要求的关节,从而简化动画设计
利用余弦定理可计算出𝜃1、𝜃2等
牛顿法
原理
大多数计算机动画中的相关问题,解析方案较复杂,不适合采用解析型求解方案,可以采用牛顿迭代法求解
-
选择一个接近函数f(x)零点的值x
-
计算f(x0)和切线斜率f ’ (x0 )
-
计算切线与x轴交点x1,通常x1会比x0更接近f(x)= 0的解
-
利用x1进行下一轮迭代
牛顿迭代法收敛速度很快,其最大优点在于通常能以较快的速度 不断靠近方程的根 。但是不保证能求得最优解,只是计算方程的一个近似值
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_n - {f(x_n)\over f'(x_n)}
xn+1=xn−f′(xn)f(xn)
应用在三链杆关节链上
已知末端影响器的位置x和y,求解𝜃1、𝜃2和𝜃3。令:
要使用牛顿法就需要知道偏导数,偏导数矩阵如图所示:
利用牛顿法迭代
Cyclic-Coordinate Descent (CCD)法
通过逐步调整关节角度,实现最小化末端影响器与目标位置之间的距离
- 调节最外侧关节使其与目标点距离最小
- 调节次外侧关节一直到最内侧
- 重复调整,接近目标点或者是达到一定迭代次数
层次结构建模
通常将人体或动物等角色分解成若干个关节链结构,并形成树状的层次结构,称为骨架树
• 首先将人体骨骼抽象成为关节和链杆组成的模型
• 然后选取其中的某个关节作为根节点,建立骨架树
• 骨架树建立后,通过关节链的正向运动学和逆向运动学求解骨架树的正向和逆向运动
顶点混合
前臂和后臂仍单独设置动画,但关节处用一柔性的 “skin”来连接。
柔性部分的一部分顶点由前臂的矩阵来变换,另一部分由后臂的 矩阵来变换。即:一个三角形的顶点可以由不同的矩阵来变换, 而不是一个矩阵
运动学模拟
时间积分
显式(前向)欧拉积分
𝑣 𝑛 + 1 = 𝑣 𝑛 + 1 𝑚 𝑓 ( 𝑝 𝑛 ) Δ t 𝑣_{𝑛+1} = 𝑣_𝑛 + {1\over𝑚} 𝑓(𝑝_𝑛) Δt vn+1=vn+m1f(pn)Δt
𝑝 𝑛 + 1 = 𝑝 𝑛 + Δ 𝑡 𝑣 𝑛 𝑝_{𝑛+1} = 𝑝_𝑛 + Δ𝑡𝑣_𝑛 pn+1=pn+Δtvn
注:𝑓( 𝑝( 𝑡𝑛) ) = 𝑓(𝑝𝑛) 𝑓(𝑝𝑛)表示物体在𝑡𝑛时刻位于 位置𝑝(𝑡𝑛)所受的力
存在问题: 因为真实位置比推算位置小,随着时间进行,相当于势能就减小的少,物体能量 (动能+势能)变大。达到某个值后,系统爆炸。因此,很少使用
辛欧拉积分
𝑣 𝑛 + 1 = 𝑣 𝑛 + 𝑓 ( 𝑝 𝑛 ) 𝑚 Δ t 𝑣_{𝑛+1} = 𝑣_𝑛 + {𝑓(𝑝_𝑛)\over𝑚}Δt vn+1=vn+mf(pn)Δt
𝑝 𝑛 + 1 = 𝑝 𝑛 + 𝑣 𝑛 + 1 Δ 𝑡 𝑝_{𝑛+1} = 𝑝_𝑛 + 𝑣_{𝑛+1}Δ𝑡 pn+1=pn+vn+1Δt
• 物体能量(动能+势能)长期维持稳定
• 在某个值附近波动
• 依赖于时间步长
隐式(后向)欧拉积分
𝑣 𝑛 + 1 = 𝑣 𝑛 + 1 𝑚 𝑓 ( 𝑝 𝑛 + 1 ) Δ t 𝑣_{𝑛+1} = 𝑣_𝑛 + {1\over𝑚} 𝑓(𝑝_{𝑛+1}) Δt vn+1=vn+m1f(pn+1)Δt
𝑝 𝑛 + 1 = 𝑝 𝑛 + 𝑣 𝑛 + 1 Δ 𝑡 𝑝_{𝑛+1} = 𝑝_𝑛 + 𝑣_{𝑛+1}Δ𝑡 pn+1=pn+vn+1Δt
物体能量(动能+势能)已知 一直减小
弹性网格
布料、头发、果冻都属于弹性对象
他们都有如下共同特征
- 通过施加在对象上的力(如挤压或者拉伸),可改变物体的形状
- 有可能随着力的消失返回初始形态
- 对象上的两个点的相对距离不固定,但是相对距离变化满足 一定的约束条件
弹簧-质量-阻尼系统(mass-spring-damper)
由于弹簧在没有阻力的情况下,会持续摆动,那么这就会造成弹性对象在受到外力作用后不断发生形变,永不停止
为了防止这种现象出现,我们在弹簧上另外附加一个阻尼系统,使得弹簧弹力逐渐减弱
阻尼力f d的方向和物体速度方向相反
头发布局
受控发丝
- 受控发丝用于粗略描绘整个发型
- 从Maya内建的表示头皮的专用几何体“生长”出 受控发丝
- 受控发丝从头皮的每个顶点沿着法线生长出来
Tessellation镶嵌
头发镶嵌处理是通过在每根受控发丝上添加质点, 以平滑受控发丝
弹簧—质量模型改进
之前建模方法虽然能模拟出一条绳子,但它的行 为更像一条锁链,因为它是完全柔软的无力的 • 加入防止过度弯曲的长度约束:加入长度约束弹 簧(红色),连接相隔一个粒子的每对粒子
现有结构存在问题:
1)无法抵抗错切方向上施力
2)无法抵抗折叠形变
改进方案:
1)增加抵抗错切方向上施力的弹簧
2)解决折叠形变 红色弹簧弹性系数弱于蓝色弹簧
最终模型
ps:布料就是由若干个质点,在任意两个连续的质点之 间加入带阻尼的虚拟弹簧构成
布料模拟计算
辛欧拉方法
其中,M是质点的质量,x、v、a、f分别表示质点的位置、速度、加速度和所受合力, h是时间步长。
大步长隐式方法
布料模拟的积分计算部分的主要开销在由于稳定性限制计算步长只能取很小值,因而被迫在两帧画面之间计算多次。 因此,设法取较大的时间步长可以有效的提高算法效率。
韦尔莱法积分
p ( t + Δ t ) = 2 p ( t ) − p ( t − Δ t ) + a ( t ) Δ t 2 p(t + \Delta t) = 2p(t) - p(t-\Delta t) + a(t)\Delta t^2 p(t+Δt)=2p(t)−p(t−Δt)+a(t)Δt2
通过t时刻以及他之前一段时刻的位置推到在t+ dt的位置
记录了物体的当前位置和之前的位置,并不需要计算物体的运动速度
水面模拟
水面建模
水面外观与地形外观非常相似 不同点在于水面外观高度是随着时间变化的
首先将平面看作普通的均匀网格,每一个网格点 (x, y)对应一个水面高度值
水面是动态的随着时间变化的,因此其网格高度值 是一个与时间相关的函数H (x, y, t)
单振源
振源处振幅随时间变化函数H(t)为
H
(
t
)
=
A
s
i
n
(
2
π
∗
t
T
)
H(t) =Asin({2\pi * t\over T})
H(t)=Asin(T2π∗t)
A为振幅大小; T为波的振动周期;
在t时刻,距离振源距离 l 处振幅大小H(l,t)为
波的传播速度为S ,波长为L,则振动周期满足 T = L / S
多振源
- 对于大面积水体(如海面),定向波浪比较适 用于表达受风吹动的水面
- 对于小的水池,通常产生波动的振源通常不是风 ,较常见的如水滴滴落,此时用圆型波浪模拟水面比较合适
模拟方法
正弦波叠加
H ( x , y , t ) = ∑ i H i ( x , y , t ) H(x,y,t) = \sum_i H_i(x,y,t) H(x,y,t)=i∑Hi(x,y,t)
幂指数模型
正余弦波的波峰和波谷波的弧度都是均匀的,但实际上水波的波峰要尖一些,波谷则要圆滑些