当前位置: 首页 > news >正文

【Unity学习笔记】第十九 · 物理引擎约束求解解惑(LCP,最优,拉格朗日乘数法,SI,PGS,基于冲量法)

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/140309494

作者:CSDN@|Ringleader|


在学习物理引擎过程中,有几大问题一直困扰着我:

  1. 约束求解到底是LCP还是带约束最优问题?
  2. 约束求解过程中拉格朗日乘数法和带约束优化中的拉格朗日乘数法是一个东西吗?
  3. 基于力的约束求解、基于冲量、基于位置的约束求解区别?
  4. 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,iN

或者
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,iN

基于位置的约束求解

线性化处理约束
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Δxb)


{ ∂ 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} {ΔxL=h21MΔx+JTλ=0(1)λL=JΔxb=0(2)

将第一项 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=h2M1JTλ 带入第二项,得: − h 2 J M − 1 J T λ = b -h^2JM^{-1}J^Tλ=b h2JM1JTλ=b,令 A = − h 2 J M − 1 J T A=-h^2JM^{-1}J^T A=h2JM1JT
则解线性方程组 A λ = b Aλ=b Aλ=b 就可以得到λ,然后 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=h2M1JTλ就可求解。

如果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,iN

同样,线性化约束 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Δvb)

{ ∂ 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} {ΔvL=MΔv+JTλ=0(3)λL=JΔvb=0(4)
− J M − 1 J T λ = b -JM^{-1}J^Tλ=b JM1JTλ=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Δvb
运用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Δvb)
满足:
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条件 ΔvL=MΔv+JTλ=0(5)JΔvb0(6)λ0(7)λT(JΔvb)=0(8)
第(8)项的条件称作互补松弛条件

分两种情况,第一种就是λ=0,即f(x)本身极值就在约束内,类似于碰撞约束中已经分离的情况,此时Δv=0,无需施加冲量;
第二种就是λ>0,因为松弛互补约束,必须 J Δ v − b = 0 JΔv-b=0 JΔvb=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˙+JM1(Fext+Fc)=J˙q˙+JM1(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} JM1JTλ=J˙q˙JM1Fext

只有λ是未知的,由此解这个线性方程组就能得到约束力 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=M1JTλΔ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+M1JTλΔt)=0 推导出

J M − 1 J T λ Δ t = − J V i n i t JM^{-1}J^TλΔt=-JV_{init} JM1JTλΔ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+M1JTλΔ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+JM1JTλΔ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) JM1JTλΔt2=JvinitΔtC(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} 最优法{ΔvL=MΔv+JTλ=0λL=JΔvb=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} {最优法h2JM1JTλ=C(x)物理分析法JM1JTλΔt2=JvinitΔtC(x)
可以看到更是非常接近。(不知道是不是推导的问题,感觉两个λ符号相反?问题不大,思路对的就行)

可以看出,用最优方法和物理分析法,得到的结果是类似的,但数学最优方式推导简洁优美,而且很容易处理不等约束,拉格朗日乘数法数学意义明确。

相反,普通物理推导方式,对于拉格朗日乘数法使用的正确性含糊其辞,且推导方式较复杂。

所以这波啊,是数学完胜!!!

问题解答

通过上面的研究,问题基本明晰,约束求解本质上就是最优问题,拉格朗日乘数法的使用,就是求解这种带约束的优化问题,而所谓的线性互补问题,就是KKT条件中的互补松弛条件,两种方法使用的拉格朗日乘数法思路都一致,可能在λ的取值上存在差异。

基于力、基于冲量、基于位置求解思路上都很相近,主要区别就是算 C C C C ˙ \dot{C} C˙还是 C ¨ \ddot{C} C¨,然后用 λ λ λ替换里面的Δx、Δv或者Fc,最后求解含唯一未知数 λ λ λ的线性方程组即可。

SI、PGS本文没涉及,但已知结论就是它俩思想上一致,前者分别逐个求解单个λ,后者对每个λ矩阵中的一行也就是 λ i λ_i λi求解,数学上效果是一致的,可能在收敛性上存在差异。

而PGS比GS多一个限制λ范围大于等于0,也就是能够求解非等式约束罢了。

完毕!

参考目录

  1. Position Based Dynamics与二次规划
  2. 基于约束的物理
  3. PhysX原理与实现:一般约束
  4. 物理引擎之约束求解(一)——线性互补问题
  5. Video Game Physics Tutorial - Part III: Constrained Rigid Body Simulation
  6. Game Physics Series 周明倫
  7. Karush-Kuhn-Tucker (KKT)条件

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker-cli nerdctl ctr crictl容器命令比较
  • 基于jeecgboot-vue3的Flowable流程支持bpmn流程设计器与仿钉钉流程设计器-编辑多版本处理
  • NLP入门——RNN、LSTM模型的搭建、训练与预测
  • 解决 Vscode不支持c++11的语法
  • SQL Server Query Store Settings (查询存储设置)
  • 08 模型演化根本 深度学习推荐算法的五大范式
  • 【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS
  • Go 协程通道使用注意
  • 在设计电气系统时,电气工程师需要考虑哪些关键因素?
  • 云计算数据中心(二)
  • 【C语言】条件运算符详解 - 《 A ? B : C 》
  • java代理模式之JDK动态代理
  • Bigdata-Docker构建大数据学习开发环境
  • git回退分支版本git reset --hard HEAD
  • Beelzebub过程记录及工具集
  • 【Amaple教程】5. 插件
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • classpath对获取配置文件的影响
  • Iterator 和 for...of 循环
  • Java 内存分配及垃圾回收机制初探
  • JavaScript函数式编程(一)
  • react-native 安卓真机环境搭建
  • Redash本地开发环境搭建
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Sublime text 3 3103 注册码
  • 程序员最讨厌的9句话,你可有补充?
  • 从零开始在ubuntu上搭建node开发环境
  • 记一次用 NodeJs 实现模拟登录的思路
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何设计一个微型分布式架构?
  • 学习Vue.js的五个小例子
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • #Linux(权限管理)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $refs 、$nextTic、动态组件、name的使用
  • (06)金属布线——为半导体注入生命的连接
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)Java 简介
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (day 12)JavaScript学习笔记(数组3)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (六)c52学习之旅-独立按键
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)SpringBoot3---尚硅谷总结
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转载)利用webkit抓取动态网页和链接
  • .NET DataGridView数据绑定说明
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET6 命令行启动及发布单个Exe文件
  • .Net实现SCrypt Hash加密