如何使用Manim创建带粒子效果的动画矢量场?
Manim带粒子效果矢量场可视化实现步骤(零经验适用)
前置环境安装
- 先安装3.9及以上版本的Python,安装过程务必勾选Add Python to system PATH,否则后续命令行无法识别Python指令
- 打开系统终端(Windows是命令提示符/PowerShell,Mac/Linux是Terminal),执行安装命令:
pip install manim - 安装完成后在终端执行
manim --version,能正常输出版本号即代表安装成功,报错优先检查Python路径是否正确添加到系统环境变量
效果核心逻辑
你要的粒子流动矢量场效果,拆解开只有三个独立模块,不需要复杂的第三方依赖:
- 矢量场定义:给平面上每个坐标点(x,y)匹配对应的二维向量,决定该位置的流动方向
- 运动粒子:生成数百个微小质点,每个质点每帧沿着所在位置的向量方向移动,飞出可视范围后自动重置到画面内随机位置,形成连续流动的观感
- 视觉优化:可以按需添加粒子拖尾、流速对应颜色/透明度、底层矢量箭头等装饰元素
可直接运行的最小实现代码
把下面的代码保存为后缀为.py的文件(比如命名为flow_field.py),所有参数都加了注释,新手可以直接修改调试:
from manim import * import numpy as np class FlowFieldWithParticles(Scene): def construct(self): # 自定义矢量场公式,修改vx、vy即可生成完全不同的流场效果 def field_func(pos): x, y = pos[0], pos[1] # 示例为带径向扩散的漩涡场,可替换为任意你需要的场公式 vx = -y + 0.15 * x vy = x + 0.15 * y return np.array([vx, vy, 0]) # 二维场z轴分量固定为0即可 # 底层矢量箭头层,不需要显示可以直接注释掉这部分代码 arrow_field = ArrowVectorField( field_func, x_range=[-7, 7, 0.5], y_range=[-4, 4, 0.5], stroke_width=1, opacity=0.3 ) self.add(arrow_field) # 初始化流动粒子 particles = VGroup() particle_total = 500 # 粒子总数,电脑性能差就调小到200-300 for _ in range(particle_total): # 粒子初始位置随机铺满画面 init_pos = np.array([ np.random.uniform(-7, 7), np.random.uniform(-4, 4), 0 ]) particle = Dot( point=init_pos, radius=0.02, color=BLUE_A ) particles.add(particle) self.add(particles) # 粒子逐帧运动更新规则 def update_particle_flow(mob, dt): flow_speed = 1.2 # 全局流动速度,数值越大粒子跑的越快 for p in mob: current_pos = p.get_center() # 获取当前位置对应的场向量 vec = field_func(current_pos) # 向量归一化,避免离原点越远粒子速度越快的问题 normalized_vec = vec / (np.linalg.norm(vec) + 1e-6) # 加极小值避免除零报错 p.shift(normalized_vec * flow_speed * dt) # 粒子飞出画面边界后,重置到随机位置形成循环 new_pos = p.get_center() if abs(new_pos[0]) > 7 or abs(new_pos[1]) > 4: p.move_to(np.array([ np.random.uniform(-7,7), np.random.uniform(-4,4), 0 ])) particles.add_updater(update_particle_flow) # 动画总时长,单位秒,按需修改 self.wait(12)
运行与调试方法
- 打开终端,切换到你刚才保存代码文件的文件夹路径
- 执行渲染命令:
manim -pql flow_field.py FlowFieldWithParticles- 参数
-p代表渲染完成后自动打开生成的视频 - 参数
-ql代表低质量快速渲染,适合调试阶段用,最终导出成片可以换成-qh走高质量渲染
- 参数
- 命令执行完成后会自动弹出渲染好的视频,第一次渲染因为要加载依赖会稍慢,后续修改参数重跑速度会快很多
常用效果调整方向
- 更换流场形态:直接修改
field_func里的vx、vy计算公式即可,比如做波浪形流场可以写vx = np.sin(y)、vy = np.cos(x),做层流可以写vx = 1、vy = 0.2*np.sin(x) - 粒子效果升级:想要拖尾效果可以把
Dot替换为TracedPath,调整stroke_width和trail_length参数控制拖尾粗细和长度;想要流速越快粒子越亮,可以在更新逻辑里把粒子透明度和向量模长绑定 - 配色调整:修改
ArrowVectorField和粒子的color参数即可更换整体配色,也可以给矢量场传入color_scheme参数实现按流速映射渐变色的效果 - 性能优化:如果渲染卡顿,先把粒子数量调低、用
-ql参数调试,确认效果没问题后再拉高参数出最终片
内容的提问来源于stack exchange,提问作者Adam Červenka
相关产品推荐
相关产品推荐

