15行代码上手 Genesis MPM 求解器:沙粒与水流仿真从原理到运行
【免费下载链接】genesis-worldSimulation platform for general-purpose robotics & embodied AI learning.项目地址: https://gitcode.com/GitHub_Trending/genesi/genesis-world
Genesis 是面向机器人和具身智能的通用仿真平台,其 MPM(物质点法)求解器专为软物质设计。本文面向刚接触变形体仿真的新手,讲清原理、给出可直接运行的最小示例,并解读核心参数。读完你即可在自己的场景中模拟沙子、液体和弹性体。
它是什么:粒子与网格的分工
大白话:把一块软材料想象成一群会"搭便车"的粒子。每走一步,粒子先把质量、速度"汇报"给脚下的固定网格,网格算好加速度后再"返还"给粒子,粒子据此移动。
严谨一点,MPM 是拉格朗日(跟随材料)与欧拉(固定空间网格)的混合算法:网格负责高效求解,粒子负责跟踪材料的大变形,因此特别适合撕裂、坍塌、流动这类网格法难以处理的场景。Genesis 的实现在 genesis/engine/solvers/mpm_solver.py,每个粒子记录位置、速度、形变梯度等状态,材料行为由不同的应力模型决定。
最小可用示例:让沙球落地
把下面 15 行保存为脚本运行(依赖已装好的 genesis 包):
import genesis as gs gs.init(backend=gs.cpu) scene = gs.Scene( sim_options=gs.options.SimOptions(dt=4e-3, substeps=10), mpm_options=gs.options.MPMOptions(grid_density=64, lower_bound=(-0.5, -1.0, 0.0), upper_bound=(0.5, 1.0, 1)), show_viewer=True, ) scene.add_entity(morph=gs.morphs.Plane()) scene.add_entity(material=gs.materials.MPM.ElastoPlastic(), morph=gs.morphs.Sphere(pos=(0.0, 0.5, 0.35), radius=0.1)) scene.build() for _ in range(1000): scene.step()运行后会弹出可视化窗口:一个绿色小球从空中落下,弹一下后不再回弹、最终瘫成饼状贴在平面上——这正是弹塑性材料的"永久变形"。想一次看三种材料,官方教程 examples/tutorials/mpm.py 把弹性盒、液体盒和弹塑性球放在同一场景里,直接跑即可。
关键参数怎么配
参数分两层:求解器层(gs.options.MPMOptions,定义在 genesis/options/solvers.py)控制网格与粒子,材料层(gs.materials.MPM.*)控制"手感"。
| 参数 | 所在层 | 作用 | 起步建议 |
|---|---|---|---|
grid_density | 求解器 | 每米网格数,决定精度 | 64(默认) |
particle_size | 求解器 | 粒子直径(米) | 留空自动按网格推算 |
lower_bound/upper_bound | 求解器 | 仿真域边界 | 尽量贴紧物体,域越大越慢 |
dt/substeps | SimOptions | 步长与子步数 | 4e-3 / 10 |
E | 材料 | 杨氏模量,越大越硬 | Elastic 默认 3e5,Liquid 默认 1e6 |
von_mises_yield_stress | ElastoPlastic | 屈服应力,超过即发生塑性形变 | 默认 10000,调小更"软塌" |
三个开箱材料各有侧重:MPM.Elastic像橡胶,可切换corotation/neohooken两种应力模型;MPM.Liquid默认无黏性,想要蜂蜜感设viscous=True;MPM.ElastoPlastic最接近沙子和面团。
进阶玩法:让水和沙"搭伙"
1. 双求解器耦合。MPM 实体可以和 SPH 流体、刚体在同一场景里互相作用。examples/coupling/sph_mpm.py 让 SPH 水冲着一只 MPM 弹性小鸭;examples/coupling/sand_wheel.py 则用两个刚体轮子搅动 MPM 沙堆,是"沙漏"式效果的现成模板。
2. 只改材料,不动几何。换材料参数即可改变整场行为:
# 无黏性 -> 有黏性,水变"糖浆" syrup = gs.materials.MPM.Liquid(viscous=True) # 调低屈服应力,弹塑性体更软、更像湿沙 wet_sand = gs.materials.MPM.ElastoPlastic(von_mises_yield_stress=2000)避坑提示
- 现象:构建时报 "Grid size larger than 1e9 not supported"。→原因:每米网格数与域尺寸乘积超限。→对策:把
lower_bound/upper_bound收紧,或调低grid_density。 - 现象:物体剧烈抖动、粒子飞出边界。→原因:时间步相对材料刚度太大。→对策:先降
dt或提高substeps,再考虑调低E。 - 现象:仿真卡顿、内存占用高。→原因:仿真域开得太宽,空网格也要计算。→对策:按官方文档提示,把边界设得越贴合物体越好。
下一步建议
- 跑一遍 examples/tutorials/mpm.py,对比 Elastic、Liquid、ElastoPlastic 三种材料的落地差异,体会
E与屈服应力的作用。 - 想看 MPM 与其他求解器如何协同,从 examples/coupling/ 里的
sph_mpm.py和sand_wheel.py入手。
求解器核心代码:genesis/engine/solvers/mpm_solver.py;材料定义:genesis/engine/materials/MPM/。
【免费下载链接】genesis-worldSimulation platform for general-purpose robotics & embodied AI learning.项目地址: https://gitcode.com/GitHub_Trending/genesi/genesis-world
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考