转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/140309494
作者:CSDN@|Ringleader|
在学习物理引擎过程中,有几大问题一直困扰着我:
- 约束求解到底是LCP还是带约束最优问题?
- 约束求解过程中拉格朗日乘数法和带约束优化中的拉格朗日乘数法是一个东西吗?
- 基于力的约束求解、基于冲量、基于位置的约束求解区别?
- SI和PGS的区别?GS与PGS区别?
最优问题
上图给出了约束的两种形式,碰撞约束(不等式约束)和关节约束(等式约束)。解决约束的方式都是沿着碰撞法线或者连杆方向施加力或者冲量,使之满足约束。
现在的问题是,满足约束的方式有很多,为什么一定要沿着约束函数梯度方向?除非你认为沿着梯度方向解决约束最快或者说引入能量最小!
这意味着你默认这就是最优问题!
那么可能的最优目标是什么呢?如果从解决约束移动距离最小来看目标函数 f ( x ) f(x) f(x)就是 Δ x Δx Δx,如果是从引入能量最小来看目标函数 f ( x ) f(x) f(x)就是 1 2 m Δ v 2 \frac{1}{2}m Δv^2 21mΔv2,写成 Δ x Δx Δx形式就是 1 2 h 2 m Δ x 2 \frac{1}{2h^2}mΔx^2 2h21mΔx2( h h h为时间步长),写成矩阵的二次型形式就是 1 2 h 2 Δ x T M Δ x \frac{1}{2h^2}Δx^TMΔx 2h21ΔxTMΔx。(注:本文不讨论旋转
)
因为有基于冲量和基于位置解决约束思路,我这里统一用能量最小约化目标。
那么约束求解就变成了带约束的二次规划问题了(先讨论等式约束),即:
m i n i m i z e f ( Δ x ) = 1 2 h 2 Δ x T M Δ x s . t . C i ( x + Δ x ) = 0 , i ∈ N minimize \quad f(Δx)=\frac{1}{2h^2}Δx^TMΔx \\ s.t. \quad C_i(x+Δx) = 0,i∈N minimizef(Δx)=2h21ΔxTMΔxs.t.Ci(x+Δx)=0,i∈N
或者
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . C i ( v + Δ v ) = 0 , i ∈ N minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad C_i(v+Δv) = 0,i∈N minimizef(Δv)=21ΔvTMΔvs.t.Ci(v+Δv)=0,i∈N
基于位置的约束求解
线性化处理约束
C i ( x + Δ x ) ≈ C i ( x ) + ∇ C i ( x ) Δ x C_i(x+Δx)≈C_i(x)+ ∇C_i(x)Δx Ci(x+Δx)≈Ci(x)+∇Ci(x)Δx
那么 C i ( x ) + ∇ C i ( x ) Δ x = 0 C_i(x)+ ∇C_i(x)Δx=0 Ci(x)+∇Ci(x)Δx=0,即 ∇ C i ( x ) Δ x = − C i ( x ) ∇C_i(x)Δx=-C_i(x) ∇Ci(x)Δx=−Ci(x)
联立所有约束,
令 J = [ ∇ C 1 ( x ) , ∇ C 2 ( x ) , . . . , ∇ C n ( x ) ] T J = [∇C_1(x),∇C_2(x),...,∇C_n(x)]^T J=[∇C1(x),∇C2(x),...,∇Cn(x)]T,
令 b = [ − C 1 ( x ) , − C 2 ( x ) , . . . , − C n ( x ) ] T b = [-C_1(x),-C_2(x),...,-C_n(x)]^T b=[−C1(x),−C2(x),...,−Cn(x)]T,
那么原二次规划问题就变为:
m i n i m i z e f ( Δ x ) = 1 2 h 2 Δ x T M Δ x s . t . J Δ x = b minimize \quad f(Δx)= \frac{1}{2h^2}Δx^TMΔx \\ s.t. \quad JΔx=b minimizef(Δx)=2h21ΔxTMΔxs.t.JΔx=b
使用拉格朗日乘数法求解,将带约束问题变为无约束问题:
拉格朗日函数: L ( Δ x , λ ) = 1 2 h 2 Δ x T M Δ x + λ T ( J Δ x − b ) L(Δx,λ)=\frac{1}{2h^2}Δx^TMΔx+λ^T(JΔx-b) L(Δx,λ)=2h21ΔxTMΔx+λT(JΔx−b)。
解
{ ∂ L ∂ Δ x = 1 h 2 M Δ x + J T λ = 0 ( 1 ) ∂ L ∂ λ = J Δ x − b = 0 ( 2 ) \begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta x} = \frac{1}{h^2} M \Delta x + J^Tλ = 0 \quad\quad(1) \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta x - b = 0 \quad\quad\quad\quad\quad(2) \\ \end{cases} {∂Δx∂L=h21MΔx+JTλ=0(1)∂λ∂L=JΔx−b=0(2)
将第一项 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=−h2M−1JTλ 带入第二项,得: − h 2 J M − 1 J T λ = b -h^2JM^{-1}J^Tλ=b −h2JM−1JTλ=b,令 A = − h 2 J M − 1 J T A=-h^2JM^{-1}J^T A=−h2JM−1JT
则解线性方程组 A λ = b Aλ=b Aλ=b 就可以得到λ,然后 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=−h2M−1JTλ就可求解。
如果A是可逆的,我们可以通过求逆来求解;如果不可逆,我们可以使用数值方法来求解,如高斯赛德尔、雅可比法、牛顿法等。
基于冲量的约束求解
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . C i ( v + Δ v ) = 0 , i ∈ N minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad C_i(v+Δv) = 0,i∈N minimizef(Δv)=21ΔvTMΔvs.t.Ci(v+Δv)=0,i∈N
同样,线性化约束 C i ( v + Δ v ) ≈ C i ( v ) + ∇ C i ( v ) Δ v = 0 C_i(v+Δv)≈C_i(v)+∇C_i(v)Δv=0 Ci(v+Δv)≈Ci(v)+∇Ci(v)Δv=0,原问题转为:
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . J Δ v = b minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad JΔv=b \\ minimizef(Δv)=21ΔvTMΔvs.t.JΔv=b
其中 J = [ C 1 ( v ) , C 2 ( v ) , . . . , C n ( v ) ] T J=[C_1(v),C_2(v),...,C_n(v)]^T J=[C1(v),C2(v),...,Cn(v)]T, b = [ − C 1 ( v ) , − C 2 ( v ) , . . . , − C n ( v ) ] T b=[-C_1(v),-C_2(v),...,-C_n(v)]^T b=[−C1(v),−C2(v),...,−Cn(v)]T, n n n为约束个数。
利用拉格朗日乘数法, L ( Δ v , λ ) = 1 2 Δ v T M Δ v + λ T ( J Δ v − b ) L(Δv,λ)=\frac{1}{2}Δv^TMΔv + λ^T(JΔv-b) L(Δv,λ)=21ΔvTMΔv+λT(JΔv−b)
解
{ ∂ L ∂ Δ v = M Δ v + J T λ = 0 ( 3 ) ∂ L ∂ λ = J Δ v − b = 0 ( 4 ) \begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \quad\quad(3) \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta v - b = 0 \quad\quad\quad\quad(4) \\ \end{cases} {∂Δv∂L=MΔv+JTλ=0(3)∂λ∂L=JΔv−b=0(4)
得 − J M − 1 J T λ = b -JM^{-1}J^Tλ=b −JM−1JTλ=b,求解线性方程组可得λ和Δv。
不等式约束情况
以基于冲量的约束求解为例,
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . J Δ v ≤ b minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad JΔv≤b \\ minimizef(Δv)=21ΔvTMΔvs.t.JΔv≤b
运用KKT条件下的拉格朗日乘数法,
L ( Δ v , λ ) = 1 2 Δ v T M Δ v + λ T ( J Δ v − b ) L(Δv,λ)=\frac{1}{2}Δv^TMΔv + λ^T(JΔv-b) L(Δv,λ)=21ΔvTMΔv+λT(JΔv−b)
满足:
K K T 条件 { ∂ L ∂ Δ v = M Δ v + J T λ = 0 ( 5 ) J Δ v − b ≤ 0 ( 6 ) λ ≥ 0 ( 7 ) λ T ( J Δ v − b ) = 0 ( 8 ) KKT条件\begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \quad\quad(5)\\ JΔv-b≤0 \quad\quad\quad\quad\quad\quad\quad(6)\\ λ≥0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(7)\\ λ^T(JΔv-b)=0 \quad\quad\quad\quad\quad(8) \end{cases} KKT条件⎩ ⎨ ⎧∂Δv∂L=MΔv+JTλ=0(5)JΔv−b≤0(6)λ≥0(7)λT(JΔv−b)=0(8)
第(8)项的条件称作互补松弛条件
。
分两种情况,第一种就是λ=0,即f(x)本身极值就在约束内,类似于碰撞约束中已经分离的情况,此时Δv=0,无需施加冲量;
第二种就是λ>0,因为松弛互补约束,必须 J Δ v − b = 0 JΔv-b=0 JΔv−b=0,这和等式约束相同。
所以对于不等式约束,同样可以使用类似等式约束的拉格朗日乘数法,但需要对λ值进行钳值,保证λ≥0即可(约束≤0则λ≥0,约束≥0则λ≤0)。
对于其中的数学解释,可以参考下面文章:
寻找“最好”(4)——不等约束和KKT条件
Karush-Kuhn-Tucker (KKT)条件
物理上的理解可以参考《基于物理的建模与动画10.3节》碰撞约束的例子,其中 a − a^- a−是碰撞前的加速度, a + a^+ a+是碰撞后的加速度。地面反作用力 f f f和 a + a^+ a+就有类似的互补性,如果 f = J λ f=Jλ f=Jλ就要求λ≥0,让对象至少不会往地面方向钻。
线性互补问题
从上面的分析可以看出,约束求解就是最优问题,很多文章虽然没有明确指出,但默认使用了上面的结论,也就是沿约束梯度方向,可以使约束求解引入的动能最小。
但为啥很多书籍和文章又称约束解决本质上是线性互补问题呢。
从前面不等约束求解使用KKT条件,其中的互补松弛条件能看出一些端倪。
我们先看一看在不使用优化思想下是怎么求解约束的。
约束力法
根据 C ˙ = J q ˙ = 0 \dot{C}=J\dot{q}=0 C˙=Jq˙=0,以及约束力于速度正交(理想约束下约束力不做功)→ F c T q ˙ = 0 F_c^T\dot{q}=0 FcTq˙=0,得到 F c F_c Fc与 J J J平行,所以 F c = J T λ F_c=J^Tλ Fc=JTλ。
其中 F c = J T λ = ∇ C 1 λ 1 + ∇ C 2 λ 2 + … + ∇ C m λ m F_c=J^Tλ=∇C_1λ_1+∇C_2λ_2+…+∇C_mλ_m Fc=JTλ=∇C1λ1+∇C2λ2+…+∇Cmλm,m是梯度的维度。
同时根据 C ¨ = 0 \ddot{C}=0 C¨=0得到:
C ¨ = J ˙ q ˙ + J q ¨ = J ˙ q ˙ + J M − 1 ( F e x t + F c ) = J ˙ q ˙ + J M − 1 ( F e x t + J T λ ) = 0 \ddot{C}=\dot{J}\dot{q}+J\ddot{q} = \dot{J}\dot{q}+JM^{-1}(F_{ext}+F_c) = \dot{J}\dot{q}+JM^{-1}(F_{ext}+J^Tλ) =0 C¨=J˙q˙+Jq¨=J˙q˙+JM−1(Fext+Fc)=J˙q˙+JM−1(Fext+JTλ)=0
则, J M − 1 J T λ = − J ˙ q ˙ − J M − 1 F e x t JM^{-1}J^Tλ=- \dot{J}\dot{q}-JM^{-1}F_{ext} JM−1JTλ=−J˙q˙−JM−1Fext
只有λ是未知的,由此解这个线性方程组就能得到约束力 F c F_c Fc。那么对应速度和位置通过积分就能获得。
这就是约束力法解约束的思路。
但这个只是无摩擦力的理想约束下,且为等式约束得出的公式,其他复杂情况是否能用类似拉格朗日乘数法暂未可知。
而且基于力的方式求解可能不适合接触约束,因为两个物体的碰撞时,互相之间的力变化很快,而且有一个很大的峰值;而且存在摩檫力约束时,循环求解时可能导致一个无穷大的值。(这段话出自游戏物理引擎(四) 约束)
基于冲量法
类似的。
施加额外冲量 I = M Δ V = ∫ t t + Δ t F d t I=MΔV=\int_{t}^{t+Δt} Fdt I=MΔV=∫tt+ΔtFdt,半隐式欧拉法的话,力认为是恒定的,那么
M Δ V = F Δ t = J T λ Δ t MΔV=FΔt=J^TλΔt MΔV=FΔt=JTλΔt, Δ V = M − 1 J T λ Δ t ΔV=M^{-1}J^TλΔt ΔV=M−1JTλΔt
根据 C ˙ = J q ˙ = J V = 0 \dot{C}=J\dot{q}=JV=0 C˙=Jq˙=JV=0,其中 V = V= V=
C ˙ = J ( V i n i t + Δ V ) = J ( V i n i t + M − 1 J T λ Δ t ) = 0 \dot{C}=J(V_{init}+ΔV)=J(V_{init}+M^{-1}J^TλΔt)=0 C˙=J(Vinit+ΔV)=J(Vinit+M−1JTλΔt)=0 推导出
J M − 1 J T λ Δ t = − J V i n i t JM^{-1}J^TλΔt=-JV_{init} JM−1JTλΔt=−JVinit
解这个线性方程组就能得到λ和Δv了,对应Δx也能得到。
如果只是通过上面解得出Δv,仅仅保证速度不会违反约束,而要保证位置同样不会违反约束,可以在速度约束加上Baumgarte 项,即 J V + b = 0 JV+b=0 JV+b=0,其中 b = − β e Δ t ( 0 < β < 1 ) b=-β\frac{e}{Δt} (0<β<1) b=−βΔte(0<β<1),e代表误差项,例如碰撞约束中就是穿透深度,β代表约束违反修正速度。
基于位置法
C ( x + Δ x ) ≈ C ( x ) + ∇ C ( x ) Δ x = 0 C(x+Δx)≈C(x)+∇C(x)Δx=0 C(x+Δx)≈C(x)+∇C(x)Δx=0,那么 J Δ x = − C ( x ) JΔx=-C(x) JΔx=−C(x),其中 J = ∇ C ( x ) J=∇C(x) J=∇C(x)
如果使用半隐式欧拉法, Δ x = v ′ Δ t = ( v i n i t + a Δ t ) Δ t = ( v i n i t + M − 1 J T λ Δ t ) Δ t Δx = v^{'}Δt=(v_{init}+aΔt)Δt=(v_{init}+M^{-1}J^TλΔt)Δt Δx=v′Δt=(vinit+aΔt)Δt=(vinit+M−1JTλΔt)Δt,
带入上面得到: J v i n i t Δ t + J M − 1 J T λ Δ t 2 = − C ( x ) Jv_{init}Δt+JM^{-1}J^TλΔt^2=-C(x) JvinitΔt+JM−1JTλΔt2=−C(x),则
J M − 1 J T λ Δ t 2 = − J v i n i t Δ t − C ( x ) JM^{-1}J^TλΔt^2=-Jv_{init}Δt-C(x) JM−1JTλΔt2=−JvinitΔt−C(x),解这个线性方程组就能得到λ,然后Δx亦可得到。
赵航在基于约束的物理说 v i n i t = 0 v_{init}=0 vinit=0,我不知道是不是PBD不考虑速度还是怎么造成的,暂不做深究,思想都差不多。
比较约束求解中最优法和普通物理分析法
分别使用最优和不适用最优的方式,都独立给出了约束求解的方法。
比较一下,例如基于冲量的方法。
最优法 { ∂ L ∂ Δ v = M Δ v + J T λ = 0 ∂ L ∂ λ = J Δ v − b = 0 最优法\begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta v - b = 0\\ \end{cases} 最优法{∂Δv∂L=MΔv+JTλ=0∂λ∂L=JΔv−b=0
和
物理分析法 { M Δ V = F Δ t = J T λ Δ t C ˙ = J ( V i n i t + Δ V ) = 0 物理分析法\begin{cases} MΔV=FΔt=J^TλΔt \\ \dot{C}=J(V_{init}+ΔV)=0 \end{cases} 物理分析法{MΔV=FΔt=JTλΔtC˙=J(Vinit+ΔV)=0
在不考虑 b b b 项差异情况下,差别仅在λ,可以发现最优方式中的λ会暗含Δt项;
而基于位置的
{ 最优法 h 2 J M − 1 J T λ = C ( x ) 物理分析法 J M − 1 J T λ Δ t 2 = − J v i n i t Δ t − C ( x ) \begin{cases} 最优法\quad h^2JM^{-1}J^Tλ= C(x)\\ 物理分析法\quad JM^{-1}J^TλΔt^2=-Jv_{init}Δt-C(x) \end{cases} {最优法h2JM−1JTλ=C(x)物理分析法JM−1JTλΔt2=−JvinitΔt−C(x)
可以看到更是非常接近。(不知道是不是推导的问题,感觉两个λ符号相反?问题不大,思路对的就行)
可以看出,用最优方法和物理分析法,得到的结果是类似的,但数学最优方式推导简洁优美,而且很容易处理不等约束,拉格朗日乘数法数学意义明确。
相反,普通物理推导方式,对于拉格朗日乘数法使用的正确性含糊其辞,且推导方式较复杂。
所以这波啊,是数学完胜!!!
问题解答
通过上面的研究,问题基本明晰,约束求解本质上就是最优问题,拉格朗日乘数法的使用,就是求解这种带约束的优化问题,而所谓的线性互补问题,就是KKT条件中的互补松弛条件,两种方法使用的拉格朗日乘数法思路都一致,可能在λ的取值上存在差异。
基于力、基于冲量、基于位置求解思路上都很相近,主要区别就是算 C C C 、 C ˙ \dot{C} C˙还是 C ¨ \ddot{C} C¨,然后用 λ λ λ替换里面的Δx、Δv或者Fc,最后求解含唯一未知数 λ λ λ的线性方程组即可。
SI、PGS本文没涉及,但已知结论就是它俩思想上一致,前者分别逐个求解单个λ,后者对每个λ矩阵中的一行也就是 λ i λ_i λi求解,数学上效果是一致的,可能在收敛性上存在差异。
而PGS比GS多一个限制λ范围大于等于0,也就是能够求解非等式约束罢了。
完毕!
参考目录
- Position Based Dynamics与二次规划
- 基于约束的物理
- PhysX原理与实现:一般约束
- 物理引擎之约束求解(一)——线性互补问题
- Video Game Physics Tutorial - Part III: Constrained Rigid Body Simulation
- Game Physics Series 周明倫
- Karush-Kuhn-Tucker (KKT)条件