在之前的模拟中,需要最小化一个能量函数H。
这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出
对于表面点,有
J^T * Σfs = 0
对于内部点,有
Σfn = 0
而对于体积蒙皮的情况,
对于表面点,仍有
J^T * Σfs = 0
对于内部点,有
J^T * W^T * fn = 0
其中W为蒙皮权重矩阵
综合两种情况,可以发现,这些力平衡情况都同H函数对内部点n、对参数p的导数等于零是等价的。
不含体积蒙皮的情况,dH/dp = J^T * Σfs
含体积蒙皮的情况, dH/dp = J^T * (Σfs + W^T * Σfn)
等式后一项有一个专门的名称,叫广义力,实际上就是普通力在参数空间的投影
现在控制的方法十分简单,就是加一项广义控制力fc
fc = kp*(p' - p) + kd*(dp'/dt - dp/dt), 其中p'是期望的参数值,p为实际参数值,kp,kd为控制增益,都为对角矩阵
于是新的总广义力为
dH1/dp = dH/dp + fc
H1 = H + fc^T * p
现时有两种施加控制的方法,一种是在每一帧求解之前预先算出控制力,且在求解过程中保持控制力不变,称为显式控制;另一种是把控制力表示成求解状态的函数,在求解过程中不断更新,称为隐式控制。
隐式控制的稳定性比显式控制好。
使用隐式控制时,令
dp/dt = (pn+1-pn)/h,其中pn+1是待求解的本帧参数值,pn为上一帧参数值
需要求出fc对位置的导数
dfc/dpn+1 = -(kp + kd/h)
把这一项加入Hessian的计算即可
以下是当前对一条棍子的控制结果
目标控制曲线如下:
实际控制曲线如下。曲线逐渐变形的原因是控制增益被逐步降低了。