清雨影的Blog
  • README
  • 机器学习
    • 一般话题
      • 再谈正则化项
      • 论文阅读:“快把卷积神经网络中的平移不变性带回来”
      • 半监督/无监督学习收集
      • 收藏夹
    • 推荐系统
      • Understanding LightGCN in a visualized way
      • Learning To Rank 之 RankNet
      • 随想: BPR Loss 与 Hinger Loss
      • 关于AA测试和AB测试的一些思考
      • 无采样的矩阵分解
      • 收藏夹
    • 强化学习
      • Re:从零开始的Multi-armed Bandit
  • 高级物理引擎实战指南笔记
    • 弹簧质点系统
    • 光滑粒子法
    • 专题:线性方程组求解
  • 有限单元法
    • 1. 引论
    • 2. 基于直接刚度法的杆系有限元方法
    • 3. 针对复杂几何形状变形体的力学描述(1)
  • Web开发相关技术
    • JWT简介
  • 技术杂文
    • React-Script转Vite时引用路径的问题
    • Let's encrypt -- 让我们一起愉快的使用HTTPS
    • 干掉吸血雷,重塑和谐P2P环境
    • 开源CAN总线信号可编程台架
    • Linux下利用mdadm设置软件 RAID
    • 互不联网时代的自给自足
    • 为什么我劝你不要使用云计算?
    • 科学的公司内网连接技术选型
    • 构建家用NAS过程中的碎碎念
    • 简易的Linux迁移指北
    • 记录一次rsync命令引起的异常
    • 为FFMPEG添加Intel QSV支持
    • 备忘录
    • 福冈外免切替(中国驾照换日本驾照)攻略
    • 记一个离谱的MySQL语句的性能问题
    • 拯救变砖的OpenWRT路由器
    • 使用FRP进行内网穿透
  • 政治不正确
    • 吃屎系列:资本家如何喂员工吃屎
      • 华为251事件记忆
    • 吃屎系列:资本家如何喂用户吃屎
      • 互不联网公司是如何强奸用户的(持续更新)
    • 吃屎系列:大学如何喂学生吃屎
    • 推荐系统如何让我们变得极端
    • 互联网政治圈观察日志
    • 中国网络防火长城简史
    • 《线性代数》(同济版)——教科书中的耻辱柱
    • 杂谈
      • 访谈:为什么毛泽东时代工人的积极性很高?
      • 90年代到21世纪初的商业环境
    • 为什么不应该用国产手机
    • “救救孩子”
  • 随园食单
    • ボロネーゼ
    • 甜酒酿的制作
    • 香草与香料
    • 皮塔饼
    • 韭菜鸡蛋饼
    • 牛肉蔬菜汤
由 GitBook 提供支持
在本页
  • 受力分析
  • 时间积分
  • 前向欧拉
  • 半隐式欧拉 (AKA. Symplectic Euler 对偶欧拉)
  • 后向欧拉
  • 大规模求解器
  • 实践记录

这有帮助吗?

  1. 高级物理引擎实战指南笔记

弹簧质点系统

上一页高级物理引擎实战指南笔记下一页光滑粒子法

最后更新于2年前

这有帮助吗?

受力分析

弹簧指点系统遵循胡克定律&牛顿运动定律:

并不复杂(当然需要考虑重力)。

时间积分

前向欧拉

通过当前的状态推测下一步的状态

  • 通过当前的受力分析计算加速度,推断下一步的速度( ×δt\times \delta t×δt )

  • 通过当前的速度计算下一步的位移

半隐式欧拉 (AKA. Symplectic Euler 对偶欧拉)

  • 通过当前的受力分析计算加速度,推断下一步的速度( ×δt\times \delta t×δt )(和上面一样)

  • 用计算出来的新速度计算下一步的位移

实现的时候,在更新计算和地面的碰撞的时候,更新位置之前首先计算和地面的碰撞(pos.y<bottom_height?),如果碰撞的,把速度设置为0。

上面两种都是显式时间积分器,问题在于对步长有限制,不可太大,否则容易爆炸:

这个公式的原因是:超过了Nyquist采样频率(TODO 找一些文献)

后向欧拉

隐式时间积分不止这一种,还有Middle-Point之类。

缺点:

  • 难以实现,难以优化

  • 每一步都会变得更加昂贵

优点:

  • 可以容忍更加大的步长

可以看到,1和2互相依赖,所以代入求解:

按照道理说,求逆矩阵是最好的,但是时间复杂度不可接受,所以我们用雅可比迭代之类的方法替代:

雅可比迭代的一个实现:

@ti.kernel
def iterate():
    for i in range(n):
        r = b[i]
        for j in range(n):
            if i != j:
                r -= A[i, j] * x[j]

        new_x[i] = r / A[i, i]

    for i in range(n):
        x[i] = new_x[i]

但是雅可比迭代使用有限制,只能收敛一些性质比较好的矩阵,对谱半径有一些要求。

使用共轭梯度的话就会更快一点。

从这里就可以看出来不同求解器的区别和联系:

大规模求解器

(仅仅是索引)

实践记录