Bullet 可变物体的底层算法分析

  • 1. 计算机图形学中可变建模方法
    • 1.1 质点—弹簧模型(离散)
    • 1.2 有限元连续体模型(连续)
  • 2. 布料模拟的两种主要算法
    • 2.1 隐式时间积分
    • 2.2 基于位置约束的动力学算法(Position-Based Dynamics,PBD)
  • 3. Bullet源码分析
    • 3.1 PBD算法

先给结论,Bullet布料仿真建模用的是有限元方法(Finite Element Method, FEM)的底层算法是基于位置约束的动力学算法(Position-Based Dynamics,PBD),这个在PyBullet Quickstart Guide目录里面有写,那代码是怎么实现的呢?

1. 计算机图形学中可变建模方法

在计算机图形学中,布料物理模拟的建模方法各不相同。其中质点—弹簧模型和有限元连续体模型是最为常见的布料物理模型。

1.1 质点—弹簧模型(离散)

质点—弹簧模型将布料视为一个带约束的网格,网格的每一个顶点都是质点,被赋予一个特定的质量。布料的力学效果通过网格顶点之间添加弹簧产生相互作用力来模拟。
三种弹簧类型和作用(如下图所示)
结构弹簧:维持布料基本形状
剪切弹簧:防止过大剪切变形
弯曲弹簧:防止出现过度弯曲



代表作: PROVOT X. Deformation Constraints in a Mass-spring Model to Describe Rigid Cloth Behaviour[J]. Graphics Interface, (1995)

1.2 有限元连续体模型(连续)

原理:将布料视为连续介质,通过有限元算法将其离散化,并基于弹性力学原理进行建模。

代表作:Wang H, O'Brien J F, Ramamoorthi R. Data-driven elastic models for cloth: modeling and measurement[J]. ACM transactions on graphics (TOG), 2011

2. 布料模拟的两种主要算法

2.1 隐式时间积分

基于牛顿第二定律,由力求出加速度后进行迭代

( I − h M − 1 ∂ f ∂ v − h 2 M − 1 ∂ f ∂ x ) Δ v = h M − 1 ( f 0 + h ∂ f ∂ x v 0 ) \left(\mathbf{I}-h \mathbf{M}^{-1} \frac{\partial \mathbf{f}}{\partial \mathbf{v}}-h^{2} \mathbf{M}^{-1} \frac{\partial \mathbf{f}}{\partial \mathbf{x}}\right) \Delta \mathbf{v}=h \mathbf{M}^{-1}\left(\mathbf{f}_{0}+h \frac{\partial \mathbf{f}}{\partial \mathbf{x}} \mathbf{v}_{\mathbf{0}}\right) (I−hM−1∂v∂f​−h2M−1∂x∂f​)Δv=hM−1(f0​+h∂x∂f​v0​)


代表作:Baraff D, Witkin A. Large steps in cloth simulation[C]//Proceedings of the 25th annual conference on Computer graphics and interactive techniques (1998)

2.2 基于位置约束的动力学算法(Position-Based Dynamics,PBD)

该方法直接计算网格顶点位置的改变,使用几何约束来描述布料的非线性特性, 以此模拟布料内部的弹力,开源软件Bullet就使用了该方法进行实时仿真.

代表作:Müller, Matthias, et al. "Position based dynamics." Journal of Visual Communication and Image Representation 18.2 (2007)

3. Bullet源码分析

3.1 PBD算法


下载Bullet源码后进入文件夹bullet3-master\src\BulletSoftBody,这里感谢一下原作者Xuchen Han,还有论文提到了可变物体与刚体的两种耦合方式。

/*Written by Xuchen Han <xuchenhan2015@u.northwestern.edu>/* ====== Overview of the Deformable Algorithm ====== *//*
A single step of the deformable body simulation contains the following main components:
Call internalStepSimulation multiple times, to achieve 240Hz (4 steps of 60Hz).
1. Deformable maintaintenance of rest lengths and volume preservation. Forces only depend on position: Update velocity to a temporary state v_{n+1}^* = v_n + explicit_force * dt / mass, where explicit forces include gravity and elastic forces.
2. Detect discrete collisions between rigid and deformable bodies at position x_{n+1}^* = x_n + dt * v_{n+1}^*.3a. Solve all constraints, including LCP. Contact, position correction due to numerical drift, friction, and anchors for deformable.3b. 5 Newton steps (multiple step). Conjugent Gradient solves linear system. Deformable Damping: Then velocities of deformable bodies v_{n+1} are solved inM(v_{n+1} - v_{n+1}^*) = damping_force * dt / mass,by a conjugate gradient solver, where the damping force is implicit and depends on v_{n+1}.Make sure contact constraints are not violated in step b by performing velocity projections as in the paper by Baraff and Witkin https://www.cs.cmu.edu/~baraff/papers/sig98.pdf. Dynamic frictions are treated as a force and added to the rhs of the CG solve, whereas static frictions are treated as constraints similar to contact.
4. Position is updated via x_{n+1} = x_n + dt * v_{n+1}.The algorithm also closely resembles the one in http://physbam.stanford.edu/~fedkiw/papers/stanford2008-03.pdf*/

这里的代码应该着重考虑帆布这类弱弹性甚至无弹性的软布,解析一下源码的步骤:
1、可变形布保持静止时长度和体积,力只取决于位置。这里大家可以想象一下塑料桌布。这里对应PBD算法的第5行
v n + 1 ∗ = v n + f ∗ d t / m a s s v_{n+1}^* = v_n + f * dt / mass vn+1∗​=vn​+f∗dt/mass
2、检测可变物体网格点与刚体之间的碰撞

3a、求解所有的约束:PBD算法第8行

3、可变形缓冲导致速度减缓,PBD算法第9-11行,这里迭代了5次。通过执行速度投影,确保在步骤 b 中不违反接触约束。 这里用了一个很精彩的处理摩擦力的策略:动态摩擦被视为一种力并添加到 CG 求解的 rhs 中,而静态摩擦被视为类似于接触的约束。

4、更新位置

所以Bullet底层的模拟算法用的就是PBD算法。

Bullet 布料仿真的底层算法分析相关推荐

  1. [图形学] 布料仿真(质点弹簧模型)

    参考:http://www.paulsprojects.net/opengl/cloth/cloth.html 写给我的室友: 布料仿真的常用方法就是将布料表达为三维网格,然后通过弹力+外力进行布料仿 ...

  2. 大型稀疏线性方程组求解技术——工业仿真的底层核心

    背  景 在工业仿真领域,对各种现实世界的问题进行数值模拟时,如流体动力学分析.电磁场仿真.结构力学应力应变分析等,其控制方程通常是偏微分方程组,在经过不同方法的隐式离散之后最终都可转化为大型稀疏线性 ...

  3. RoboCup仿真3D底层通信模块介绍(一)

    server和agent之间通信的msg格式 & agent的传感器 文章目录 server和agent之间通信的msg格式 & agent的传感器 一.General Percept ...

  4. RoboCup仿真3D底层通信模块介绍(二)

    server和agent之间通信的msg格式 & agent的效应器 文章目录 server和agent之间通信的msg格式 & agent的效应器 一.General Effecto ...

  5. Unity 布料仿真笔记2 欧拉积分 Verlet积分分析

    前言 An object at rest remains at rest, unless acted upon by an exterior force. An object in motion re ...

  6. 基于matlab的RS编译码仿真,从底层原理分析RS编译码的实现过程

    欢迎订阅<FPGA学习入门100例教程>.<MATLAB学习入门100例教程> 目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础

  7. 拜读近五年UT Austin Villa发表的RoboCup仿真3D论文

    前言: UT Austin Villa是近几年Robocup仿真3D项目中稳稳当当的世界冠军,他们每年拿了冠军之后都会发1到2篇论文来阐述他们的进步,其论文内容已经形成了固定模板.首先是Introdu ...

  8. python仿真智能驾驶_自动驾驶仿真工程师

    禁止私自转载,转载请联系作者. 想要做一个自动驾驶仿真工程师,我们要学的还远远不够. 对自动驾驶仿真工程师这个岗位,相关介绍还是少了些.有些公司是直接把它纳入到基础架构组里,有些是单独招聘这个岗位,还 ...

  9. ar编码matlab仿真_机器人常用可视化仿真工具

    机器人系统设计离不开仿真工具的支持.机器人仿真让我们在没有物理硬件的情况下也可以快速对算法进行验证:或者提高安全性,避免实验损伤我们的设备(比如在增强学习中,就需要大量random的explorati ...

最新文章

  1. STM8启动分析及IAP
  2. android 解决Error:This Gradle plugin requires Studio 3.0 minimum
  3. linux端口映射_Linux 系统安全与优化配置
  4. 使用git上传代码到github远程仓库
  5. 【LeetCode】390. 消除游戏
  6. matlab r2014a错误,MATLAB中的潜在错误使R2014a回归
  7. accept标头 php,如何在PHP中读取任何请求标头
  8. git-比对不同-diff
  9. 中科院自动化所目标跟踪论文整理!三篇综述、两篇ICCV 2019!
  10. 单片机C语言PWM程序原理,单片机C语言程序设计:用 ADC0808 控制 PWM 输出
  11. opencv常用函数整理(二)
  12. windows 一些恶搞的bat小脚本
  13. 高数篇(三)-- 最小二乘法、正则化
  14. python能开发手机app吗_python开发手机app和java相比,缺点是什么?
  15. Android音乐播放器的比较。
  16. 利用CSS,实现翻页效果
  17. android+路由器+名称,路由器默认wifi名称是什么?
  18. 重拳出击之《JVM》面试官版 (初哥勿看)
  19. linux质控命令,RNA-seq摸索:2.sra下载数据→fastqc质控→hisat2/bowtie2/STAR/salmon比对→Samtools格式转换→IGV可视化结果...
  20. DP敏感度(全局,局部,平滑)

热门文章

  1. JAVA,OpenLDAP使用心得(3)
  2. python运维必须会用的库
  3. 无聊猿如何成了「元宇宙」的基础?
  4. error: commands commence before first target
  5. 网易社招一面(Java)
  6. 《电力电子技术》课程教学大纲
  7. 转:摆脱内耗,只能把“情绪”戒了吗?
  8. 1分2分5分的硬币,组成1角,共有多少种组合
  9. 特别详细的POST 注入 思路
  10. 新的开始,全新的开始