Manim文档及源码笔记-CE文档-示例库1基本概念
参考原文:
Manim Community Edition
Example Gallery
前言
笔记随想:
暂未发现官方中文版,自己实践代码的同时,顺便做翻译加深理解~
除了给出原文档中的展现效果及源码,我把实践代码过程的笔记也分享出来,另外最后设计出一些技能训练的内容,强化学校效果。行文格式:示例-标号及名称
展现效果
操作拆解
源码直击
代码实践
技能训练
更新【new】:
- 8月23日
-
- “笔记随想”前后标注了“前言”与“正文”;
-
- 本系列暂告段落,把“上一节”、“下一节”升级为系列目录,放到了文尾;
- 后续更新备忘:文中“【建设中】”的内容;欢迎朋友们催更~
正文
本示例库包含一系列最佳实践代码片段及其相应的视频/图像输出,展示了整个库的不同功能。这些都是在麻省理工学院的许可下,所以请随意复制并粘贴到您的项目中。享受这Manim的味道!
提示
这个图库并不是我们文档中唯一可以看到明确代码和视频示例的地方:我们的参考手册中还有更多示例–例如,请参阅我们的文档中的模块tex_mobject
、geometry
、moving_camera_scene
等等。
查看我们的交互式Jupyter环境,它允许在线运行示例,而无需本地安装。
此外,访问我们的推特了解更多Manim模型!
基本概念,Basic Concepts
示例1:ManimCELogo
展现效果1
操作拆解1
图形图像非常直观,示例库编排也先从这里开始。
- 若想在VScode(或用Anaconda在浏览器)中用Jupyter Notebook逐框交互模式,加入的语句;
-
- 这行后面和前/上面不要加注释,避免报错;
-
- 渲染名称和类的名称保持一致;
- 构建construct(self)函数/方法;
- 常用的操作:
-
- 背景颜色设置;
-
- 画常见图形的方法,圆、方形、三角形;
-
-
- 颜色(可提前定义),是否填充
-
-
-
- 图层覆盖关系,order matters
-
-
-
- 图形位置坐标
-
- 字母调用
源码直击1
%%manim -v WARNING -qm ManimCELogo
from manim import *
class ManimCELogo(Scene):
def construct(self):
self.camera.background_color = "#ece6e2"
logo_green = "#87c2a5"
logo_blue = "#525893"
logo_red = "#e07a5f"
logo_black = "#343434"
ds_m = MathTex(r"\mathbb{M}", fill_color=logo_black).scale(7)
ds_m.shift(2.25 * LEFT + 1.5 * UP)
circle = Circle(color=logo_green, fill_opacity=1).shift(LEFT)
square = Square(color=logo_blue, fill_opacity=1).shift(UP)
triangle = Triangle(color=logo_red, fill_opacity=1).shift(RIGHT)
logo = VGroup(triangle, square, circle, ds_m) # order matters
logo.move_to(ORIGIN)
self.add(logo)
参考:MathTex,Circle,Square,Triangle
代码实践1
技能训练1
单独整理到此【建设中】
示例2:BraceAnnotation
展现效果2
操作拆解2
在示例1中,头脑浮现出的图形、文字,已经画出了来,现在开始进入“量化/数值化”阶段;首先是画出线段并做基本标注;
- 按照线段定义编写代码即可:两点、连线;
-
- 画点:向量模式;
-
- 连线:注意实际来看,“点”也是有面积的,要取其中心;
- 进一步做相应标注:线段长度的常见标注:
-
- 大括号及公式方法的调用;
-
- 看不见的线段/位置该如何处理;
源码直击2
%%manim -v WARNING -qm BraceAnnotation
from manim import *
class BraceAnnotation(Scene):
def construct(self):
dot = Dot([-2, -1, 0])
dot2 = Dot([2, 1, 0])
line = Line(dot.get_center(), dot2.get_center()).set_color(ORANGE)
b1 = Brace(line)
b1text = b1.get_text("Horizontal distance")
b2 = Brace(line, direction=line.copy().rotate(PI / 2).get_unit_vector())
b2text = b2.get_tex("x-x_1")
self.add(line, dot, dot2, b1, b2, b1text, b2text)
参考:Brace,get_text()
,get_tex()
代码实践2
技能训练2
单独整理到此【建设中】
示例3:VectorArrow
展现效果3
操作笔记3
进一步量化,现在引入直角坐标系;
- 建立直角坐标系
- 画出向量
-
- 起点在原点
-
- 箭头从起点出发,指向位置(数组表示),buff的作用;
- 做出基本标注
-
- 在原点的下方显示文字;
-
- 在箭头的右侧显示文字;
源码直击3
%%manim -v WARNING -qm GradientImageFromArray
from manim import *
class VectorArrow(Scene):
def construct(self):
dot = Dot(ORIGIN)
arrow = Arrow(ORIGIN, [2, 2, 0], buff=0)
numberplane = NumberPlane()
origin_text = Text('(0, 0)').next_to(dot, DOWN)
tip_text = Text('(2, 2)').next_to(arrow.get_end(), RIGHT)
self.add(numberplane, dot, arrow, origin_text, tip_text)
参考:Dot,Arrow,NumberPlane,Text
代码实践3
技能训练3
单独整理到此【建设中】
示例4:GradientImageFromArray
展现效果4
操作拆解4
这次是渐变效果;
- 借助numpy矩阵数组,实现渐变逻辑;
- 巧用for i in range( , )一行搞定所需循环;
源码直击4
%%manim -v WARNING -qm GradientImageFromArray
from manim import *
class GradientImageFromArray(Scene):
def construct(self):
n = 256
imageArray = np.uint8(
[[i * 256 / n for i in range(0, n)] for _ in range(0, n)]
)
image = ImageMobject(imageArray).scale(2)
image.background_rectangle = SurroundingRectangle(image, GREEN)
self.add(image, image.background_rectangle)
参考:ImageMobject
代码实践4
技能训练4
单独整理到此【建设中】
示例5:BooleanOperations
展现效果5
BooleanOperations
操作拆解5
现在我们可以通过简短动画展示一个数学概念了。
这里展示了布尔运算,通过经典的集合运算来做图解。
注:无矩形表全集的文氏图Venn Diagram
- 两个集合,可以用椭圆表示;
-
- 椭圆的调用,参数设置:
宽、高、不透明度、颜色,以及边的厚度;
- 椭圆的调用,参数设置:
-
- 动画的调用方法;
-
- 组成两个椭圆成为一组;
-
- 淡入淡出的调用方法;
- 四种运算图示表达:
-
- 交集Intersection
-
- 并集Union
-
- 对称差Exclusion
-
- 差集Difference
源码直击5
from manim import *
class BooleanOperations(Scene):
def construct(self):
ellipse1 = Ellipse(
width=4.0, height=5.0, fill_opacity=0.5, color=BLUE, stroke_width=10
).move_to(LEFT)
ellipse2 = ellipse1.copy().set_color(color=RED).move_to(RIGHT)
bool_ops_text = MarkupText("<u>Boolean Operation</u>").next_to(ellipse1, UP * 3)
ellipse_group = Group(bool_ops_text, ellipse1, ellipse2).move_to(LEFT * 3)
self.play(FadeIn(ellipse_group))
i = Intersection(ellipse1, ellipse2, color=GREEN, fill_opacity=0.5)
self.play(i.animate.scale(0.25).move_to(RIGHT * 5 + UP * 2.5))
intersection_text = Text("Intersection", font_size=23).next_to(i, UP)
self.play(FadeIn(intersection_text))
u = Union(ellipse1, ellipse2, color=ORANGE, fill_opacity=0.5)
union_text = Text("Union", font_size=23)
self.play(u.animate.scale(0.3).next_to(i, DOWN, buff=union_text.height * 3))
union_text.next_to(u, UP)
self.play(FadeIn(union_text))
e = Exclusion(ellipse1, ellipse2, color=YELLOW, fill_opacity=0.5)
exclusion_text = Text("Exclusion", font_size=23)
self.play(e.animate.scale(0.3).next_to(u, DOWN, buff=exclusion_text.height * 3.5))
exclusion_text.next_to(e, UP)
self.play(FadeIn(exclusion_text))
d = Difference(ellipse1, ellipse2, color=PINK, fill_opacity=0.5)
difference_text = Text("Difference", font_size=23)
self.play(d.animate.scale(0.3).next_to(u, LEFT, buff=difference_text.height * 3.5))
difference_text.next_to(d, UP)
self.play(FadeIn(difference_text))
参考:Union,Intersection,Exclusion
代码实践5
技能训练5
单独整理到此【建设中】
本系列目录【new】
Manim文档及源码笔记-CE文档-示例库1基本概念【本文】
Manim文档及源码笔记-CE文档-示例库2动画
Manim文档及源码笔记-CE文档-示例库3使用Manim绘图
Manim文档及源码笔记-CE文档-示例库4特殊摄像机设置
Manim文档及源码笔记-CE文档-示例库5进阶项目