【GAMES201学习笔记】01- 拉格朗日视角

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

1. 拉格朗日视角 vs 欧拉视角

拉格朗日视角:其中的元素跟随一起移动。

欧拉视角 :其中的元素固定在对应的地方,网格的点对应的速度。

screenShot.png

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(xixj2lij)xij^=jj=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} tvitxi=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 代码

  1. 计算速度: 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
  2. 与地面碰撞(防止计算位移之后陷入地下)
  3. 计算位移: 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 (c1)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值