1. 拉格朗日视角 vs 欧拉视角
拉格朗日视角:其中的元素跟随一起移动。
欧拉视角 :其中的元素固定在对应的地方,网格的点对应的速度。

2. 弹簧质点系统
胡克定律
f i j = − k ( ∥ x i − x j ∥ 2 l i j ) x i j ^ f i = ∑ j j ≠ i f i j \begin{aligned} \bold{f}_{ij} &= -k(\Vert \bold{x}_i - \bold{x}_j \Vert_2 l_{ij})\hat{\bold{x}_{ij}} \\ \bold{f}_i &= \sum^{j \neq i}_j {\bold{f}_{ij}} \end{aligned} fijfi=−k(∥xi−xj∥2lij)xij^=j∑j=ifij
牛顿第二定律
∂ v i ∂ t = 1 m i f i ∂ x i ∂ t = v i \begin{aligned} \cfrac{\partial \bold{v}_i}{\partial t} &= \cfrac{1}{m_i}\bold{f}_i \\ \cfrac{\partial \bold{x}_i}{\partial t} &= \bold{v}_i \end{aligned} ∂t∂vi∂t∂xi=mi1fi=vi
2.1 时间积分
前欧拉(显式)积分器 :根据现有状态推测以后的状态
v t + 1 = v t + Δ t f t m x t + 1 = x t + Δ t v t \begin{aligned} \bold{v}_{t+1} &= \bold{v}_t + \Delta t \cfrac{\bold{f}_t}{m} \\ \bold{x}_{t+1} &= \bold{x}_t + \Delta t \bold{v}_t \\ \end{aligned} vt+1xt+1=vt+Δtmft=xt+Δtvt
半隐式欧拉积分器 :根据现有状态推测以后的状态,速度根据推测出的速度计算
v t + 1 = v t + Δ t f t m x t + 1 = x t + Δ t v t + 1 \begin{aligned} \bold{v}_{t+1} &= \bold{v}_t + \Delta t \cfrac{\bold{f}_t}{m} \\ \bold{x}_{t+1} &= \bold{x}_t + \Delta t \bold{v}_{t+1} \\ \end{aligned} vt+1xt+1=vt+Δtmft=xt+Δtvt+1
2.2 代码
- 计算速度: v t + 1 = v t + Δ t f t m \bold{v}_{t+1} = \bold{v}_t + \Delta t \cfrac{\bold{f}_t}{m} vt+1=vt+Δtmft
- 与地面碰撞(防止计算位移之后陷入地下)
- 计算位移: x t + 1 = x t + Δ t v t + 1 \bold{x}_{t+1} = \bold{x}_t + \Delta t \bold{v}_{t+1} xt+1=xt+Δtvt+1
@ti.kernel
def substep():
# Compute force and new velocity
n = num_particles[None]
for i in range(n):
v[i] *= ti.exp(-dt * damping[None]) # 阻尼
total_force = ti.Vector(gravity) * particle_mass
for j in range(n):
# 两个粒子有弹簧时
if rest_length[i, j] != 0:
x_ij = x[i] - x[j]
total_force += -spring_stiffness[None] * (x_ij.norm() - rest_length[i, j]) * x_ij.normalized()
v[i] += dt * total_force / particle_mass
# Collide with ground
for i in range(n):
if x[i].y < bottom_y:
x[i].y = bottom_y
v[i].y = 0
# Compute new position
for i in range(num_particles[None]):
x[i] += v[i] * dt
NOTE :
- 其中 Δ t \Delta t Δt 需要满足一下情况:
Δ t = c m k ( c ∼ 1 ) \Delta t = c\sqrt{\cfrac{m}{k}} (c \sim 1) Δt=ckm(c∼1)
2.3 质点系统
隐式时间积分 :
x t + 1 = x t + Δ t v t + 1 v t + 1 = v t + Δ t M − 1 f ( x t + 1 ) \begin{aligned} \bold{x}_{t+1} &= \bold{x}_t + \Delta t \bold{v}_{t+1} \\ \bold{v}_{t+1} &= \bold{v}_t + \D

本文探讨了拉格朗日和欧拉视角在动力学中的应用,特别关注弹簧质点系统的胡克定律和牛顿运动定律。通过时间积分方法,介绍了前欧拉、半隐式欧拉以及不同类型的代码实现,涉及形变、弹性体模型如Neo-Hookean和Corotated,以及MPM和FEM中的弹性力学计算。
最低0.47元/天 解锁文章
1536

被折叠的 条评论
为什么被折叠?



