Manim 流体流动动画 5 个实验:一行向量场函数让粒子起舞
【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos
一条向量场 lambda 函数就能指挥满屏粒子排出漩涡、波浪和喷泉:3b1b/videos 仓库里的 fluid_flow.py 用 Manim(manimgl)把 3Blue1Brown 数学视频中的流体流动动画做成了可交互的实验台。下面用 5 个实验带你逐个把玩"向量场驱动粒子"这件事,先跑起来,再换函数看效果。
Manim 流体动画环境怎么搭起来
- 装环境:manimgl 需从源码安装(3b1b 版 manim),并配好 LaTeX;
- 拿代码:
git clone https://gitcode.com/GitHub_Trending/vi/videos; - 在仓库根目录敲一条命令:
manimgl _2015/ka_playgrounds/fluid_flow.py VectorFieldExample -p-p是预览模式,不渲染成片。窗口里先画出坐标轴、黄色箭头和蓝色粒子,然后粒子群开始流动:四个旋涡把粒子卷进角落,中间的对角方向又向外甩,整面屏像两股气旋在互相较劲。
核心机制速览:一行函数如何决定粒子运动
self.use_function( lambda (x, y, z) : 0.5*((2*y)**3-9*(2*y))*RIGHT + 0.5*((2*x)**3-9*(2*x))*UP ) self.add_dots(show_creation=True) self.flow(run_time=30, virtual_time=3)FluidFlow 这个类先在平面撒下一整排蓝点,再让每个点沿当前所在位置的"转向牌"挪动一小步,一帧一帧挪出动画。lambda 就是那块转向牌:传入坐标,返回方向加快慢。virtual_time指走了多少物理时间,run_time指视频多长,两个比例就是播放速度。
换个函数看流动怎么变:5 张实验卡片
实验 1:绕原点转圈
【运行】manimgl _2015/ka_playgrounds/fluid_flow.py ConstantPositiveCurl -p【现象】粒子绕原点做同心圆旋转,一圈套一圈,像浴缸里排水形成的漩涡,谁也逃不出去。 【变量】转向函数里的系数0.5换成2:转速加快,圆变密;换成0.1:慢悠悠地转。
实验 2:波浪形剪切流
【运行】manimgl _2015/ka_playgrounds/fluid_flow.py VectorFieldExampleTwo -p【现象】整排粒子向右平移,上下速度不同,规整的方格被拉成波浪状条纹——这就是剪切流,水表层和底层滑得不一样快。 【变量】场景里流动是flow(run_time=1)连跑 10 次,把次数加到 30,条纹拉得更长更碎。
实验 3:汇聚成一点
【运行】manimgl _2015/ka_playgrounds/fluid_flow.py NegativeDivergenceExamlpe -p【现象】粒子从四面八方涌向原点,近处粒子窜得飞快,像地面水篦子吸走水洼,圈里先画出一个黄圆当"下水口"。 【变量】转向函数开头那个负号换成正号,立刻变成向外喷的喷泉,也就是 PositiveDivergenceExample 的玩法。
实验 4:四漩涡系统
【运行】manimgl _2015/ka_playgrounds/fluid_flow.py FourSwirlsWithoutCircles -p【现象】场里出现四个旋涡,粒子被甩进两个对角旋涡并越转越贴,另两个对角方向不断往外吐新粒子。 【变量】virtual_time从2改成10:同样的 20 秒视频里,粒子被卷得离圈更远、轨迹更夸张。
实验 5:鞍点分道扬镳
【运行】manimgl _2015/ka_playgrounds/fluid_flow.py QuadraticField -p【现象】粒子沿两条对角线分道扬镳:一条线上被吸走,另一条线上被甩出去,中间夹着不动的点,这就是二次向量场里的鞍点。 【变量】rate_func=linear保持不变时,把virtual_time从10减到3,粒子只挪半步,看得清谁进谁出。
风格调节:4 个改动最明显的参数
dot_spacing(CONFIG 默认0.5):调小到0.25粒子更密,纹理更细;调大到1稀疏,适合看清单个点的轨迹。vector_length(默认0.5):箭头统一缩放到这个长度,调小箭头短而齐整,看不出快慢;想要"看箭头长短读速度",改调add_vectors(true_length=True),箭头真实反映场强。vector_color/dot_color:默认黄箭头配蓝点,换个高对比配色,漩涡方向更一眼可读。run_time与virtual_time的比值:比值大,慢动作看细节;比值小,快进看整体形态。
探索路线图
| 场景 | 看点 |
|---|---|
| VectorFieldExample | 入场动画,箭头、粒子、流动三件套齐全 |
| ConstantPositiveCurl | 最纯粹的旋转场,同心圆轨迹 |
| NegativeDivergenceExamlpe | 汇聚与喷泉的对照(类名保留原版拼写) |
| FourSwirlsWithoutCircles | 多旋涡 + 额外注入粒子 |
| DropletFlow | 高密度色块模拟,像一滴墨入水,渲染耗时较长 |
粒子沿场移动这一步由 PhaseFlow 动画完成,它随 manimlib 提供,经由 manim_imports_ext.py 一并导入;背景样式还能从 custom/backdrops.py 里挑。
收尾与你的下一个场
跑完 5 个场景应该已经摸清骨架:满屏粒子的所有花样都来自那个 lambda——换函数就是换物理规则。现在轮到你:写一个转向函数,让粒子逆时针绕原点转圈,且离原点越近速度越快,把它塞进use_function再跑一次VectorFieldExample看看。提示:速度方向取(-y*RIGHT + x*UP),大小除以get_norm(p)就行。
【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考