让公式动起来:Manim 三维物理动画从入门到完整场景的完整指南
让公式动起来Manim 三维物理动画从入门到完整场景的完整指南【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim如果课堂上的抛物线不再是一行印刷体公式而是屏幕上真的有一颗球被扔出去、落地、弹起学生的眼睛会先于耳朵理解物理。这正是ManimManim 3b1b社区维护的 Python 数学动画框架擅长的事用几十行 Python 代码把力学、电磁学这类抽象过程变成可播放、可暂停、可逐帧调参的三维动画。本文面向第一次接触 Manim 的读者按先跑起来 → 拆零件 → 装整机的顺序带你做出一个完整的阻尼振子场景。Manim 是什么先看清全貌一句话概括Manim 是一个声明式动画引擎——你描述物体在某一时刻长什么样它负责补间、渲染、编码成视频。它有三类核心能力恰好覆盖物理动画的全部需求能力解决的问题对应源码矢量图形与 3D 物体球、曲面、坐标系、轨迹线manim/mobject/three_d/three_dimensions.py动画与更新器让物体按物理规律逐帧运动manim/animation/、manim/mobject/value_tracker.pyLaTeX 公式渲染把牛顿定律、洛伦兹力写进画面manim/utils/tex_templates.pyManim 内部把几乎所有图形都拆成贝塞尔曲线段来存储与渲染上图这也是为什么画一条电场线和画一个弹簧在实现上没有本质区别——都是曲线区别只在于你给的参数方程。跑通第一个三维场景环境准备与渲染命令推荐用 conda 或 uv 安装官方给了完整清单见 docs/source/installation/conda.rst随后任何脚本都用同一条命令渲染# -ql 低画质快速预览-p 渲染完自动播放 manim -pql my_scene.py FirstBall开发阶段永远加-ql一遍渲染只要几秒正式出片时去掉-q换回高清。最小可运行示例一颗转动的球from manim import * class FirstBall(ThreeDScene): def construct(self): # phi/theta 是球面角先定机位再放物体 self.set_camera_orientation(phi70 * DEGREES, theta45 * DEGREES) ball Sphere(radius1, resolution(24, 24)) # resolution 控制表面细分越大越圆越慢 ball.set_color(RED) self.add(ball) self.play(Rotate(ball, angleTAU, axisUP))注意两个容易被忽略的点相机角度在放物体之前设定ThreeDScene的机位决定之后所有物体的投影方式Sphere本质是一组参数曲面继承自Surfaceresolution(24, 24)这类元组分别控制经度、纬度的采样密度调它等于在画质和速度之间取平衡。静态机位用默认渲染器就够了如果之后想让相机环绕飞行再切换到 OpenGL 渲染器-r opengl参见 docs/source/faq/opengl.md。三维场景常用的现成素材比如给场景当地图背景可以直接放在example_scenes/assets/里参考用法三个工具让物体真正动起来Manim 不是物理引擎它不知道质量是什么。它提供的是一种更朴素的模式你手动物理公式算出每一帧的位置再喂给图形对象。实现这个模式的三件套如下。3D 积木块Sphere、Cube 与 Surface三维几何件集中在 manim/mobject/three_d/three_dimensions.py开箱可用的有Sphere、Cube、Cylinder、Cone、Torus、Arrow3D等。构造参数以几何量中心、半径、范围为主例如用u_range/v_range就能切出半个球half Sphere(centerLEFT * 2, u_range(0, PI)) # 只取半个方位角得到一个球壳配合 manim/mobject/three_d/three_d_utils.py 里的法向量工具函数还可以做表面朝向、阴影之类的细节。时间守门员ValueTracker updaterValueTracker是物理动画里出现频率最高的角色它把一个标量通常是时间 t藏在一个 Mobject 里通过animate语法随时间平滑变化再让其他物体的 updater 每帧读取它源码与官方示例见 manim/mobject/value_tracker.py。t ValueTracker(0) # 存时间 dot Dot(colorBLUE) dot.add_updater(lambda m: m.move_to([1.5 * t.get_value(), 0, 0])) self.add(dot, t) # 关键tracker 必须 add 进场景updater 才会跑 self.play(t.animate.set_value(4), run_time4)这个一个 tracker 一群 updater的结构就是 Manim 里一切连续运动的底层协议——斜抛、轨道、振动全是它的变体。把物理公式写进画面MathTex默认就加载了physics宏包预置模板定义在 manim/utils/tex_templates.py 中所以\vec、\ket、\E、\B这类物理符号可以直接用law MathTex(r\vec{F} q(\vec{E} \vec{v} \times \vec{B})) # 洛伦兹力开箱即用 self.play(Write(law))想自定义字体或加载别的宏包可以自己构造TexTemplate传进tex_template参数模板库里ctex、simple等变体都写在同一个文件里。组装完整场景一个会衰减的弹簧振子把上面三件工具拼起来就是完整的物理叙事。下面的阻尼振子没有调用任何物理库运动方程y A·e^(−γt)·cos(ωt)是纯数学动画只是它的逐帧求值import numpy as np from manim import * class DampedSpring(Scene): def construct(self): wall Line(LEFT * 3, LEFT * 3 UP * 2, colorGREY) # 固定端 mass Square(side_length0.6, colorBLUE) # 质量块 t ValueTracker(0) A, omega, gamma 1.2, 2.0, 0.35 # 振幅、角频率、阻尼系数 def follow_law(m): # 每帧按阻尼简谐方程算出高度写回物体位置 y A * np.exp(-gamma * t.get_value()) * np.cos(omega * t.get_value()) m.move_to([0, 1 y, 0]) mass.add_updater(follow_law) self.add(wall, mass, t) self.play(t.animate.set_value(3 * TAU), run_time6) mass.clear_updaters() # 播完记得清掉 updater避免残留更新运行后可以立刻做实验把gamma改成 0 看等幅振荡改大到 1.5 看欠阻尼变过阻尼式的快速归零——参数即剧情这是纯代码做动画相对视频剪辑最大的优势。想要把画面与旁边的位移-时间曲线联动思路也一样再画一组Axes用一个 updater 按同一公式描点即可。图片素材、表格、曲线混排的场景示例可在 example_scenes/basic.py 里对照阅读常见问题与调优渲染器怎么选场景建议原因二维公式、静态三维截图默认 Cairo依赖少、速度快、画质稳定相机环绕、实时窗口预览-r openglOpenGL 渲染器支持相机动态运动和交互窗口见 docs/source/faq/opengl.md正式出片先-ql调好脚本再去掉-q渲染高清渲染耗时与分辨率平方相关渲染太慢怎么办降预览质量-ql低画质-r 480,270低分辨率组合是调试期的默认姿势用缓存manim/utils/caching.py 提供基于哈希的缓存机制未改动的中间结果比如一张复杂Surface会被复用避免整段场景重复渲染查热点脚本卡在某一帧时可用 snakeviz 这类火焰图工具定位是几何采样还是编码拖了后腿官方性能指南里有完整的剖析流程docs/source/guides/deep_dive.rst。新手最容易踩的四个坑给物体传mass、friction参数——会直接报TypeError。Manim 的 Mobject 只关心几何物理量请放进自己的变量里算再由 updater 写回位置三维坐标系里 y 才是上[x, y, z]中 y 轴竖直向上把高度写进第三个分量是新手最高频的错误ValueTracker忘了self.addtracker 不在场景里挂在别人身上的 updater 不会更新画面会冻在初始位置这类 bug 没有任何报错只能靠检查self.mobjects排查公式渲染失败MathTex编译依赖本机 LaTeX 环境缺包时错误信息往往指向 tex 日志而非 Python 栈装 conda 版或 Docker 版docs/source/installation/docker.rst可以一次性绕开。资源入口与下一步官方文档总入口docs/source/index.rst安装与依赖conda / uv / Dockerdocs/source/installation/可直接运行的场景范例example_scenes/basic.py、example_scenes/opengl.py三维物体与曲面源码manim/mobject/three_d/three_dimensions.py动画体系Transform、Composition、Updatersmanim/animation/从一颗转动的球到会衰减的弹簧振子你已经走过了 Manim 物理动画的完整链路定机位 → 摆积木 → 用ValueTracker注入时间 → 按方程求值。建议下一步把阻尼振子扩展成双摆或者给点电荷画一组随时间转动的电场线——这两道题的每个零件本文都已经给过了。想动手的话先把仓库拉到本地对着example_scenes/逐个运行git clone https://gitcode.com/GitHub_Trending/man/manim【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

日新闻

周新闻

月新闻