参考资料汇总

我的笔记

PBD初探 https://blog.csdn.net/weixin_43940314/article/details/126065813

XPBD 文献笔记 https://blog.csdn.net/weixin_43940314/article/details/126686064

primal dual PBD 文献笔记 https://blog.csdn.net/weixin_43940314/article/details/129792090

PBD相关的软件

Houdini中的Vellum https://www.sidefx.com/docs/houdini/vellum/index.html

Mile Macklin的Flex(闭源仅N卡) https://github.com/NVIDIAGameWorks/FleX

NVidia的 physX (开源N卡) https://github.com/NVIDIA-Omniverse/PhysX

PBD是什么

它是一种数值求解的算法,主要用在固体求解上。可以用于布料、软体、流体、刚体、塑性体等。最早是Matthias Muller 等人在2007年提出的。Miles Macklin在2016年提出XPBD是对PBD的一大改进。PBD优点是速度快,稳定。

PBD

PBD初探 https://blog.csdn.net/weixin_43940314/article/details/126065813

算法如下

(物体受到的力分为内力和外力。外力就是重力等不会受到物体形变量影响的力。内力则是弹性力等让物体恢复变形的力。内力都可以写成constraint的形式。PBD不像FEM那样去计算受力,然后积分得到下时刻位置。而是直接通过约束的满足来得到位置的修正量。约束的施加就相当于是内力了。)

核心在于标黄的第9到11步。也就是project constraints

我们可以设计出多种多样的constraints,比如体积约束,距离约束,应变约束,流体密度约束,刚体约束,塑性约束等等…

PBD的魅力正在于此。你可以结合多种多样的约束设计出自己的solver。

另外,碰撞和摩擦也可以设计成constraint。我们后面会讲。

project Constraints的公式为

算出lambda,然后带入第一行的公式计算出距离修正量,最后施加距离修正量即可。

XPBD

XPBD 文献笔记 https://blog.csdn.net/weixin_43940314/article/details/126686064

我的讲解 https://www.bilibili.com/video/BV17D4y1M76v/

XPBD的算法如下

它与PBD的唯一区别就在于lambda

也就是多了第7步和第9步。

公式为

这里的dlambda和原始PBD中的s相比,只是在分母和分子项分别多了alpha项。假如alpha设置为0,那么就会还原为PBD。alpha是材料参数,是柔度,也就是刚度的倒数。这里的波浪线代表alpha除以dt平方:

XPBD的好处在于:通过引入alpha, 让系统的条件数降低了, 因此更容易收敛。并且相比于原始PBD中的k,alpha是更容易调节的材料参数。原始PBD可以认为是alpha为0的系统,因此是刚度无穷大的系统,条件数比较大。

根据刘天添的fast simulation of mass-spring system 中的论证,XPBD相当于是隐式的欧拉时间积分。这就是其稳定的来源。

约束大全

主要参考文献

Jan Bender, Matthias Müller and Miles Macklin, A Survey on Position Based Dynamics, 2017 主要是第五章

约束公式我们需要知道两点:

  1. 约束本身的公式
  2. 约束的梯度(对位置的导数)

1 距离约束: stretching/distance constraint

对于弹簧连接的两个点x1和x2,最小化下面的约束相当于让弹簧回到原长d。

n就是法向量

2 弯曲约束(二面角):Bending/Dihedral constraint

二面角约束就是让夹角回到原角度。

n1和n2是两个面的法向量,phi0是原角度

把n1和n2写成用x表示的公式,得到

二面角约束的梯度稍微复杂一点

由于只涉及相对位置,所以不妨我们这里假设p1位置为零点。


最终的距离修正量为

3 Isometric Bending: 等距弯曲

(Bender2014)

除了二面角,还有一种Bending约束,就是在对角线上新增加一个弹簧。然后利用弹簧的距离约束来实现弯曲约束。


其中Q是local Hessian bending energy

Q是一个4x4的矩阵,是常数,可以被precompute。

A0 and A1 是 adjacent triangles 的面积

K是

碰撞和摩擦 Collisions and frictions

4 三角面碰撞 Triangle Collisions

对于任一点q与三角面之间的碰撞,让两者保证一个最小间距h即可。h就是布料的厚度。

n是面法向量。把n写开,得到公式

另外,值得注意的是三角面有两个方向(q在内部和q在外部,面法向量指向外部)

5 环境碰撞 Environment collision

假设一个粒子的位置为x。先找到所有与其有可能碰撞的平面法向量n,然后施加如下约束。drest是初始情况下的间距。

6 粒子碰撞 particle collision

两个粒子之间保持最小距离。这可以用来模拟沙子。

7 摩擦

(Macklin2014)

摩擦比较特殊,没有给出约束,但是给出了距离修正量。我们假设点i与点j之间发生了摩擦。


第一行是静摩擦,第二行是动摩擦。mu_s是静摩擦系数,mu_k是动摩擦系数。

其中delta x 垂直 代表的是x与其摩擦的平面之间的切向滑移的距离(也就是去掉了垂直分量)

其中x*是当前的当前的候选位置,包含了之前所有约束的距离修正量。x是时间步开始的时候的位置。

n是摩擦平面的法向。

与其摩擦的另一个点j的距离修正量为。

8 四面体体积约束:tetrahedral volumetric constraint

很简单,就是让四面体回复到原始体积。

如果是二维,退化为面积约束。

9 气球约束: Ballon

气球就是一块封闭的布料。内部有压力。

10 表面网格的体积约束:surface mesh volumetric conservation

(Diziol2011)
一般体积约束用四面体。假如能用三角面也能做体积约束,就会节约很多计算量。

核心思想仍然是让体积回复原始体积

但是,我们可以用散度定理将体积分转换为面积分。其中A是面积。i是三角形编号。n是面法向。

其中上面加一横线表示对所有包含点i的三角面的area weighted normal 。

值得注意的是,这里wi不再是质量倒数,而是


g与l分别代表global 和 local

alpha是可控的参数

还有一个单独控制local的公式。使用参数beta

11 空气网格做碰撞:Air Mesh

碰撞物体外面的空气也做成网格,保证其不翻转,就能做碰撞。


上面的是2D,下面的是3D.

这种方法的最大好处是解决entagle state问题。也就是即使压扁成一个面,也能恢复原状。

FEM/Strain based dynamics: 基于应变/FEM的约束

12 Strain Energy Constraint

(Bender14)

这套做法基本上和FEM差不多。都是推导出应变-应力-应变能。几乎可以看做只是把FEM那一套换了个皮。

约束为应变能(也就是弹性势能)


其中V是原体积。psi是能量密度。Es是strain energy。

F是deformation gradient。

约束梯度为

其中P是PK1.


其中C是胡克定律中的刚度矩阵

epsilon是应变。如果采用非线性应变,也就是格林应变

那么这种本构叫做St VK 本构模型

在FEM中,本构模型是可以换的。比如可以换为NeoHooken模型。

这里deformation gradient可以用当前位置计算出来。


其中D是shape matrix。Ds是deformed shape matrix, Dm是undeformed shape matrix。

其中X代表的rest postion。也就是初始位置。所以Dm可以预计算。

13 Strain Based Dynamics

(Muller14)

另外一种方案不是计算出能量密度来,而是直接去限制应变。

其中S是

对角项对应拉伸变形

非对角项对应剪切变形

于是就有了以上两个constraint

为了让stretch constraint 的 gradient 为线性的,对第一个公式进行修改:

为了让shear与stretch分开,对第二行公式进行修改

f是F的某一列的列向量。

14 Elastic rod

绳子是一个在三维中的一维物体。但是它是能够产生三维的变形的。绳子能产生拉伸、剪切、扭转、弯曲变形。(stretch/shear/torsion/bending)

首先是stretch+shear

其中p1和p2是一小段绳子的两个顶点。q是四元数,用于描述绳子的方位。d3是沿着这段绳子中心线的切向量。或者说是沿着绳子的截面的法向量,它是四元数的函数。

对应的距离修正量为

其次是Bending+torsion


其中第一行那个花体符号其实是Im(对应latex \Im), 就是Imaginary,也就是虚部。即取四元数的虚部。

其中Omega是Darboux vector。它的物理意义类似于角速度。

其中alpha是保证Darboux vector unique的,因为四元数q和-q都能产生相同的Darboux Vector。

位置修正量为


另外记得每次更新后都要对q归一化。

其中wq本来应该是转动惯量的逆,但是这里简单地用inverse mass 来代替了。

15 刚体铰链

(Deul14)

(注意这个不是shape matching)

描述刚体与粒子系统的不同之处在于,我们要求解的变量不再是粒子的位置,而是刚体的平移和旋转。平移有3个自由度,旋转有3个自由度。

我们以铰链系统为例。它是定义在相对坐标系上的。

某个铰链点的位置根据平移和旋转来决定。左边的P是世界坐标。右边的是物体坐标。

与PBD相同,从对constraint的taylor展开开始。

其中那个花体符号是theta,是描述转轴的向量。它也叫exponential map。

应该注意的是,与之前粒子的PBD不同,增加了theta。所以这里的约束的梯度grad C写成J

这里举一个例子:用铰链来描述刚体运动。

对于球形铰链连接的两个点p1和p2

其中J为

对于球形铰链来说,第一项就是单位阵

第二项中的第一部分也是单位阵

第三部分则复杂一些,可以参考 Grassia1998

接下来就是PBD的常规流程

根据以下公式得到lambda

然后得到更新量(只不过不仅需要平移,也需要旋转)

最后更新世界坐标系下的速度和角速度。

16 流体(PBF)

最简单的流体其实是设定一个粒子之间的最小间距约束。这会产生类似沙子的效果。granular material,颗粒物质。

如果想模拟水,则可以使用PBF。PBF是基于SPH的密度约束的。它几乎是PCISPH套了个壳子。

定义密度约束

密度通过采样得到

gradC只需要利用预计算的核函数梯度

位置修正量

17 shape matching(刚体 弹性体 塑性体)

请看我的笔记

https://blog.csdn.net/weixin_43940314/article/details/125961503

https://blog.csdn.net/weixin_43940314/article/details/125952851

https://blog.csdn.net/weixin_43940314/article/details/125913088

shape matching的核心思想就是让变形了的物体回复到原来的shape。

通过一个矩阵A来记忆这个shape。而通过还原的多少来分别模拟刚体(立即完全还原)、弹性体(完全还原但过程缓慢)
和塑性体(部分还原且过程缓慢)

下图中R代表rotation, c代表center of mass translation


最小化的约束为

记忆原始形状的A为


As是对称的,无旋转。

Ar则需要极分解来提取出旋转

要恢复的goal position为


最终的位置修正量为

alpha是0到1的控制参数。可以让物体不回复到原状,制造塑性效果。

其他shape matching的变体

Region-Based Shape Matching

Fast Summation

FastLSM

Adaptive Lattices

oriented particles

Plastic Deformation

Large Elasto-Plastic Deformation

region-based shape matching

shape matching for Cloth Simulation

Implementation

graph coloring

方案1:
在Gauss-Seidel的并行中,由于一个顶点会被多个四面体共享,所以在写入位置的时候,会导致race condition。一种方案是利用atomic_add。但是这样会导致很慢。

方案2:
另一种方案是做graph coloring。也就是给约束分组,让互不关联的部分并行运行。比如1-2 3-4 5-6分为一组。2-3 4-5 6-7分为一组。先处理一组,再处理另一组。组内可以并行。也就是一组相当于一个阶段。颜色数决定了需要分多少阶段来运行。

方案3:
还有一种方案是使用Jacobian solver。也就是求解约束以后都先存储到相应的约束对应的position delta之中。最后在施加位置修正量。这种方案比起graph coloring的好处是负载平衡。

方案4:
Jacobian的缺点是它的收敛速度比Gauss-Seidel慢得多,尤其是系统非正定的时候。为了解决这个问题,可以使用欠松弛方法。比如约束平均(constraint-averaging)或者是质量分裂(mass-spliting)方法。基于约束平均的方法如下:

其中omega是松弛因子,建议取1到2之间。而ni代表的是这个粒子i被几个constrait所同时影响。delta xi是一次迭代完全结束之后对于粒子i的位置修正量。由于平均本身就已经做了欠松弛,所以这里omega建议不要取小于1的值,因为已经没有必要进一步欠松弛。

方案5:
还有一种方案是混合GS和Jacobian方法。

一种简单的混合方案是先对k-1个颜色进行GS迭代,然后对剩余的constraint进行Jacobian迭代。

Unified particle system

在该框架中,所有一切都用粒子表示。

在shape matching时,首先voxelize一切物体,然后在每个voxel中放置粒子。最后用shape matching可以模拟刚体。物体之间可以增加额外的约束来进行链接。比如可以用刚体和布料连接出来一个降落伞。

每个粒子额外存储一个phase属性。同一个phase内部的粒子之间无碰撞。

约束之间可以组合。比如可以用流体+刚体组成一个融化的模型。

我现在在做的PBD库:tiPBD

在dev分支

https://github.com/chunleili/tiPBD/tree/dev

这是taichi pbd库。

需要taichi>= 1.4.1和meshtaichi

使用方法:

在data/scene中添加场景文件,在model中添加几何文件(现在仅支持tetgen格式),然后从根目录运行main.py

python main.py

文件结构

  • main # 主程序入口
  • data
    • scene # 场景文件
    • model # 模型文件
  • engine # 引擎
    • solver # 求解器, 用于实例化具体的pbd solver,以及ggui
    • metadata # 元数据: 几乎是所有数据的中转中心,你可以从这里获取一切参数,包括场景、模型、网格、材料参数等。
    • fem # 基于有限元的PBD。
      • fem_base # 有限元基类 除了约束投影以外的所有步骤
      • arap: # as rigid as possible 本构模型的约束投影
      • neohooken: # neo-hooken模型的约束投影
      • mesh: # 基于meshtaichi的网格数据
  • ui # 用户界面
    • parse_commandline_args: # 解析命令行参数
    • config_builder # 用于从json场景文件构建配置文件,传给metadata
    • filedialog # 打开文件对话框以选择json场景文件

Everything about PBD:关于PBD的一切!相关推荐

  1. Pbd反编译(PBD文件变为PBL)(pbdviewer)特性

    Pbd反编译 1). 反编译powerbuilder编译后的pbd文件,支持版本5,6.5,7,8,9,10,10.5,11,11.5,12,12.5,12.6,PKB2.5,共计13个版本. 2). ...

  2. 防止被反编译获取源码,PB加密,PBD加密,杜绝PB程序反编译 下载

    1). 对Powerbuilder编译出来的PBD, DLL, EXE, 文件混淆加密,支持版本: 5,6.5,7,8,9,10,10.5,11,11.5,12,12.5,12.6,PKB2.5. 共 ...

  3. PB加密,PBD加密,杜绝PB程序反编译,PB加密工具

    如下是一个pbd混淆加密之后用反编译打开时的效果图(混淆器已经开发了十年,其代码混淆保护效果一直满意,用图说话)工具自2009年开发,2010年发布测试版,经历1-2年的测试改进,至最早的客户从201 ...

  4. powerbuilder pbd文件保护方式-pb防止反编译研究

    pb中编译后的变量名是于明码方式放置并形成一个列表.如: ls_111.ls_222.ls_333.ls_444 如上,"."代表的是0x00,就是分隔符号. 紧跟变量列表后面,有 ...

  5. 反编译pbd文件中的dw,利用pb本身的功能

    主要的核心代码如下: string ls_pbd = 'e:\例子目录\例子文件.pbd' setlibrarylist(ls_pbd) if pos(getlibrarylist(),ls_pbd) ...

  6. ilk,pch,pbd,obj,idb,pdb这些扩展名的意思

    *.ilk..........一种链接临时文件 *.pch..........一种预编译头文件 *.pbd..........一种 PowerBuilder 动态库,作为本地DLL的一个替代物 *.o ...

  7. ilk,pch,pbd,obj,idb,pdb这些扩展名各是什么意思

    *.ilk..........一种链接临时文件 *.pch..........一种预编译头文件 *.pbd..........一种 PowerBuilder 动态库,作为本地DLL的一个替代物 *.o ...

  8. PBD(Position Based Dynamics)学习笔记

    符号说明 仿真物体包括 NNN 个节点和 MMM 个约束. 每个节点 i∈[1,...,N]i\in [1,...,N]i∈[1,...,N] 包含的参数有质量 mim_imi​ .位置 xi\bol ...

  9. 啥是腾讯PBD ,看我给讲讲

    本文转自https://www.jianshu.com/p/b0c538e33bbd,如有侵权请及时联系 今天在学习信通院 研发运营安全白皮书-2020年 时,忽然看到腾讯分享的 <腾讯研发运营 ...

  10. 【物理模拟】PBD算法详解

    参考: Matthia Muller的十分钟物理(他就是PBD算法的发明者) https://matthias-research.github.io/pages/tenMinutePhysics/ 原 ...

最新文章

  1. ElementUI中el-table在表格最下方添加一列汇总小计行
  2. think.class.php下载,PHP_ThinkPHP实现将本地文件打包成zip下载,首先,将FileToZip.class文件放到T - phpStudy...
  3. Java黑皮书课后题第3章:*3.32(几何:点的位置)给定一个从点p0(x0,y0)到p1(x1,y1)的有向线段,可以用以下公式判定定点p2(x2, y2)是在线段的左侧、右侧,或者在该线段上
  4. Node.js Up and Runing 学习日记(八)
  5. promtail 配置详解_基于loki+promtail+grafana技术的日志集合
  6. 十二赞日志收集与报警系统一览
  7. 我们还很时尚freeeim
  8. php stomp rabbitmq,php实现通过stomp协议连接ActiveMQ操作示例
  9. asp编程实例:通过表单创建word的一个例子
  10. visualGraph 下载
  11. UE4官方文档学习笔记材质篇——分层材质
  12. 读者推荐 · 一个美观的简历生成器
  13. 带通滤波器中心频率计算公式中R是哪个值_LCC-HVDC 交流滤波器选择策略
  14. 51单片机的室内环境监测系统,MQ-2烟雾传感器和DHT11温湿度传感器,原理图,C编程和仿真
  15. 跳棋编程c语言代码,跳棋游戏C语言程序设计(数据结构课程设计).doc
  16. 易宝支付java待遇_Java学员张**入职易宝支付月薪12000元
  17. 网易云信 NIM_duilib 源码分析
  18. 关于Ubuntu18.04+win10双系统开机引导错误的解决方法
  19. PHP距离高考还剩多少天,今天距离2022年高考还有多少天
  20. 示例:波士顿房价预测

热门文章

  1. 写写关于持久层,业务层和控制层的自己看法
  2. Neo4j 小白入门
  3. Possibly consider using a shorter maxLifetime value.
  4. 【Apache】Web 服务器配置与 FTP 服务器配置
  5. 太忙,没时间学?在职人员如何高效备考MBA?
  6. 格林威克轴承:常见的轴承类型有哪些?
  7. 一探究竟:安信可模组ESP32-SU、ESP32-SL和ESP32-S对比,区别在哪里?
  8. android 使用vitamio播放mkv文件实现音轨切换
  9. Intellij IDEA自动导入jar包
  10. java keypress_jquery 键盘事件 keypress() keydown() keyup()用法总结