fluid_flow 流体可视化:改一个 lambda 就把蓝点吹成漩涡与四重流场
【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos
你在终端敲下一条命令,屏幕里立刻涌出几百个蓝点,顺着黄色箭头滑出漩涡。fluid_flow 用 Manim 做流体可视化,让粒子沿向量场(Vector Field)走,前置只有一行环境——装好 3b1b 版 manim。
跑通流体可视化
这条命令在快速档下渲染基础四漩涡场景,直接出一段低清视频。
manim _2015/ka_playgrounds/fluid_flow.py VectorFieldExample -qm你会看到:白色坐标轴铺开,黄色箭头标出每一点的速度方向,几百个蓝点从网格顺箭头滑出,绕着几处漩涡旋转、收拢。
底层引擎是 3Blue1Brown 的 Manim,此仓库用的是 3b1b 版 manim(manimlib),不是社区版。注意:这个 2015 场景面向较老的工具链,若本地 manim 在lambda (x, y, z)这类旧写法上报错,与仓库 README 的提示一致,换到匹配的 manim 版本即可。
它到底在算什么
它不模拟真实流体的压力与粘度,核心只有一个数据结构:向量场(Vector Field)。把它想成贴满整面墙的风向标——每个位置插着一根小旗,旗子指向该处流体的去向,长短代表速度。FluidFlow 做的事只有一步:取一个点,问它脚下的旗子指向哪,就把点朝那个方向挪一小段,反复做就成了动画。
这段代码做了什么:flow 把每个粒子点的中心,沿self.function在该点给出的方向推一段时间。
def flow(self, **kwargs): self.play(ApplyToCenters( PhaseFlow, self.dots.split(), function=self.function, **kwargs ))跑完你看到:整片粒子网格沿箭头整体位移,漩涡、剪切、收拢的差别一目了然。它并不解 Navier-Stokes 方程,只是让点沿你给的方向走。
换一组函数,看不同流态
ConstantPositiveCurl
粒子绕原点画同心圆,像浴缸排水;旋度(Curl)恒定,箭头首尾相接成圈。
lambda p : 0.5*(-p[1]*RIGHT+p[0]*UP)
manim _2015/ka_playgrounds/fluid_flow.py ConstantPositiveCurl -qm
NegativeDivergenceExamlpe
蓝点从四周向原点收拢,像放水的水池,散度(Divergence)为负。
lambda p : -p/(2*get_norm(0.5*p)**0.5+0.01)
manim _2015/ka_playgrounds/fluid_flow.py NegativeDivergenceExamlpe -qm
IncompressibleFluid
粒子沿正弦波水平滑行、上下层错动,像河水流过浅滩的剪切(Shear)流动。
lambda (x, y, z) : RIGHT+np.sin(x)*UP
manim _2015/ka_playgrounds/fluid_flow.py IncompressibleFluid -qm
QuadraticField
粒子在鞍点附近分岔,有的被吸向中心、有的被甩出,像水流绕过石头。
lambda (x, y, z) : 0.25*((x*x-y*y)*RIGHT+x*y*UP)
manim _2015/ka_playgrounds/fluid_flow.py QuadraticField -qm
调参速查
| 参数 | 控制什么 | 推荐起点 | 调大 / 调小的直观效果 |
|---|---|---|---|
| vector_spacing | 箭头网格疏密 | 1 | 调大箭头更稀,调小更密 |
| dot_spacing | 粒子点间距 | 0.5 | 调大点更疏,调小更密且更卡 |
| vector_length | 箭头长度 | 0.5 | 调大箭头更醒目,调小方向难辨 |
| run_time | 播放时长(秒) | 5~30 | 调大更慢看清细节,调小更快 |
| virtual_time | 模拟推进的物理时长 | 1~3 | 调大点走得更远,调小点几乎不动 |
策略:先定 virtual_time 让点走出可辨位移,再拉 run_time 与它的比例做慢放或快进。
文件地图
_2015/ka_playgrounds/fluid_flow.py— FluidFlow 基类与十几个可切场景都在这一个文件里manim_imports_ext.py— 统一 import 入口,把 manimlib 和 custom 组件一次拉进来custom/backdrops.py— 场景背景(深色底 / 渐变)的定义README.md— 说明用的是 3b1b 版 manim,旧场景可能不直接跑
想深入可以翻的方向:一是翻 manimlib 里 PhaseFlow / ApplyToCenters 的实现,看"沿场推点"的步长和速率怎么取;二是翻 once_useful_constructs/ 里的区域(region)与向量场辅助构件,用来扩展视觉。
把 FourSwirlsWithoutCircles 里的9改成5再重跑,漩涡会向内收紧、间距变小。换个系数就是换个流场,现在就试。
【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考