资讯详情

Manim 流体可视化实战:一条命令跑通 Python 流体动画的完整指南

📅 2026/9/15 20:21:52 | 华诺云谱 👁 阅读
Manim 流体可视化实战:一条命令跑通 Python 流体动画的完整指南
Manim 流体可视化实战一条命令跑通 Python 流体动画的完整指南【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos先说你会看到什么坐标轴上插满黄色箭头蓝色圆点从网格位置出发顺着箭头方向慢慢流走画面中间卷出几个漩涡。这个画面出自 GitHub 项目 vi/videos它是 3blue1brown 数学动画视频的源码仓库基于 Manim 生成全部数学可视化动画其中 _2015/ka_playgrounds/fluid_flow.py 只用了几十行 Python 就实现了流体可视化场景。这篇文章从它入手先跑起来再讲原理最后改出你自己的流动。30 秒跑出第一个 Python 流体动画把仓库克隆下来然后跑一条命令git clone https://gitcode.com/GitHub_Trending/vi/videos python -m manim _2015/ka_playgrounds/fluid_flow.py VectorFieldExample -pl-pl是预览模式渲染很快。VectorFieldExample 这个场景有点长坐标轴、箭头、粒子依次摆出来最后 flow 用了 run_time 30 秒、virtual_time 只有 3所以流动很慢像延时摄影。只想确认能动的话预览模式就够了。另外提醒一句README 里明确说了仓库里的老场景依赖 manim 的旧版本3b1b 版。如果运行报错先确认你的 manim 版本对得上再去怀疑场景本身。向量场粒子听话的秘密整个文件的核心只有两个方法。use_function登记一个函数给它一个点它返回流体在该点该往哪走、走多快。flow则把粒子网格交给这个函数播一段 ApplyToCenters 动画所有圆点同时开动。self.use_function(lambda (x, y, z): 0.5*(y**3-9*y)*RIGHT 0.5*(x**3-9*x)*UP) self.add_dots(show_creationTrue) # 摆出粒子网格 self.flow(run_time30, virtual_time3) # 让粒子跑起来箭头其实是把这个函数打印给你看的add_vectors在每个网格点算一次函数值画一支箭头零值点会被过滤掉。箭头层不动动的只有点层。你可以这么理解箭头层是路牌点层是车流。粒子摆多密、箭头画多长由 CONFIG 里的几个参数决定dot_spacing管粒子间距vector_spacing管箭头密度vector_length管箭头长度。VectorFieldExample 把 points_width、points_height 都设成 4把流动限制在一个 4×4 的方格里。这个文件里所有场景都从 manim_imports_ext.py 导入公共动画组件驱动粒子流动的 PhaseFlow 也在里面。你不用关心这些内部细节只管递对函数就行。改一行函数换一种流动文件里有二十多个场景类但差异全都塞在一行 lambda 里。每个场景的骨架一样use_function 换函数add_axes、add_vectors、add_dots 摆场flow 收工。下面是三个实验的函数菜单lambda p: 0.5*(-p[1]*RIGHT p[0]*UP) # 1. 漩涡 lambda p: p/(2*get_norm(0.5*p)**0.5 0.01) # 2. 向外发散 lambda p: -p/(2*get_norm(0.5*p)**0.5 0.01) # 2. 向内汇聚 lambda (x, y, z): RIGHT np.sin(x)*UP # 3. 剪切滑动实验一让粒子转圈 函数 1 的方向永远垂直于半径离原点越远走得越快。对应场景 ConstantPositiveCurl 用 true_lengthTrue 画箭头所以越靠近中心箭头越短越往外越长。粒子绕原点画同心圆是最标准的漩涡。把系数 0.5 的符号改一下旋转方向就反过来了。实验二一进一出 函数 2 和 2 只差一个负号。PositiveDivergenceExample 用加号是源粒子从中心流出走得越远越慢NegativeDivergenceExamlpe 用减号是汇粒子被吸进去越靠近越快。两个场景各画了一圈黄色圆圈帮你判断粒子穿过圆圈时是向外还是向内两屏对照着看散度这个词就有了实感。实验三错位滑动函数 3 的竖直分量是正弦波每个点都往右走但快慢上下不一。原本对齐的点阵会被扭成波浪线。IncompressibleFluid 把 flow 连续跑 8 轮可以一直盯着这个过程看。FourSwirlsWithoutCircles 是这一路的加强版三次函数在画面四角堆出四个旋涡点粒子不画圈而是沿对角线方向漂移。慢动作与快进flow 的两个时间参数flow 有两个旋钮run_time是实际播放多久virtual_time是流动推进了多少物理时间。两者的比值决定画面快慢。self.flow(run_time20, virtual_time2) # 慢动作2 秒的流动放 20 秒看 self.flow(run_time5, virtual_time10) # 快进10 秒的流动压进 5 秒VectorFieldExample 的 30 对 3 接近十倍慢放适合盯单条粒子轨迹CurlArticleExample 用 run_time15、virtual_time10快进看整体走势。还有个细节粒子流出画面后会空场。ConstantOutwardFlow 的做法是每轮 flow 之后复制一个点、朝八个方向撒出八份新点让画面一直满着。换个思路把粒子当墨水上面的场景都走标准 flow。DropletFlow 换了条路它用 PointDot高密度点簇当水滴摆出一排然后逐帧给每个粒子的坐标手工累加 0.001*function(p)一跑就是 5 分钟。画面像墨水在水里化开从蓝到绿再到黄的渐变让质感比单点丰富得多。这种逐帧手算的写法最容易被你搬走不依赖 flow函数加一个循环就够了。想自己做 Python 流体动画建议从这里开始。下一步可以做的三个小实验复制 VectorFieldExample把它的 lambda 换成lambda p: (-p[1]*RIGHT p[0]*UP)/get_norm(p)SingleSwirl 的写法对比实验一的同心圆。保留实验三的函数把 CONFIG 里 vector_length 从 0.5 改成 0.1看箭头变短之后还能不能读出流向。交换 DropletFlow 里 virtual_time 与 run_time 的两个值观察墨水扩散的速度变化。【免费下载链接】videosCode for the manim-generated scenes used in 3blue1brown videos项目地址: https://gitcode.com/GitHub_Trending/vi/videos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。