manim 实现的基本逻辑
源:https://docs.manim.community/en/stable/guides/deep_dive.html
总的来说,分为三个部分:
1、预备
导入库:
from manim import *
在__init__.py文件里也会导入config:
from ._config import *
此代码初始化了manim的配置系统
场景的实例化和渲染:
在命令行进行,或者在Jupyter notebooks进行(使用了%%manim魔术指令)。例如:
scene = ToyExample()
随后Scene.__init__设置了一些属性,随后Scene基于config.renderer的值实例化一个CairoRenderer或者OpenGLRenderer对象……(还调用了ffmpeg,总之用于渲染)
Scene.render()描述了一个场景完整的渲染周期,这里有三个定制的方法:Scene.setup()、Scene.construct()、Scene.tear_down()
2、Mobject初始化
指定了一些最初的属性,像name、submobjects、color,两个方法被使用:reset_points和generate_points,最后使用了init_color,事实上,这三个方法是空的。
Mobject有三种:ImageMobject、PMobject、VMobject,VMobject代表vectorized mobjects,它具有四组点,其中第一个和第四个代表锚点anchor,第二个和第三个代表手柄handle
例如:
def playscene0(): plane = NumberPlane() vmobject = VMobject(color=GREEN) vmobject.points = [ np.array([-3, 0, 0]), np.array([-3, 2, 0]), np.array([-2, 3, 0]), np.array([0, 3, 0]), np.array([0, 3, 0]), np.array([2, 3, 0]), np.array([3, 2, 0]), np.array([3, 0, 0]), ] sa(plane, vmobject);sw()
这样可以产生半个椭圆
我们来考察一下Square的构造,首先Square使用了父类Rectangle的init方法,它仅仅使Rectangle的长宽相等:
super().__init__(height=side_length, width=side_length, **kwargs)
我们继续看Rectangle的构造,它具有了自己的属性(如width),它继承自Polygon,Polygon继承自Polygram,Polygram继承自VMobject
……介绍了self.add()
3、动画的实现
一个Animation总是和一个mobject相连。Animation的初始化通过Animation.__init__()实现,它保证Animation.starting_mobject和Animation.mobject这两个属性产生,动画开始,starting_mobject属性代表一份不更改的mobject副本,在实例化中变为占位符mobject,mobject属性代表Animation中的mobject
Animation具有如下几个特殊的方法:Animation.begin()、Animation.finish()、Animation.interpolate()(实现完成百分比例的动画)
我们考察一下ReplacementTransform的构造:ReplacementTransform……Transform……Animation
……以下介绍的是渲染的过程,并没有介绍Animation的本质,有机会继续完成
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~