Manim文档及源码笔记-CE文档-示例库1基本概念

Manim文档及源码笔记-CE文档-示例库1基本概念

参考原文:
Manim Community Edition
Example Gallery

前言

笔记随想:
暂未发现官方中文版,自己实践代码的同时,顺便做翻译加深理解~
除了给出原文档中的展现效果及源码,我把实践代码过程的笔记也分享出来,另外最后设计出一些技能训练的内容,强化学校效果。行文格式:

示例-标号及名称
展现效果
操作拆解
源码直击
代码实践
技能训练

更新【new】:

  • 8月23日
    • “笔记随想”前后标注了“前言”与“正文”;
    • 本系列暂告段落,把“上一节”、“下一节”升级为系列目录,放到了文尾;
  • 后续更新备忘:文中“【建设中】”的内容;欢迎朋友们催更~

正文

本示例库包含一系列最佳实践代码片段及其相应的视频/图像输出,展示了整个库的不同功能。这些都是在麻省理工学院的许可下,所以请随意复制并粘贴到您的项目中。享受这Manim的味道!

提示
这个图库并不是我们文档中唯一可以看到明确代码和视频示例的地方:我们的参考手册中还有更多示例–例如,请参阅我们的文档中的模块tex_mobjectgeometrymoving_camera_scene等等。
查看我们的交互式Jupyter环境,它允许在线运行示例,而无需本地安装。
此外,访问我们的推特了解更多Manim模型!

基本概念,Basic Concepts

示例1:ManimCELogo

展现效果1

示例1:ManimCELogo

操作拆解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)

参考:MathTexCircleSquareTriangle

代码实践1

代码实践1

技能训练1

单独整理到此【建设中】

示例2:BraceAnnotation

展现效果2

示例2:BraceAnnotation

操作拆解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)

参考:Braceget_text()get_tex()

代码实践2

代码实践2

技能训练2

单独整理到此【建设中】

示例3:VectorArrow

展现效果3

示例3:VectorArrow

操作笔记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)

参考:DotArrowNumberPlaneText

代码实践3

代码实践3

技能训练3

单独整理到此【建设中】

示例4:GradientImageFromArray

展现效果4

示例4:GradientImageFromArray

操作拆解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

技能训练4

单独整理到此【建设中】

示例5:BooleanOperations

展现效果5

BooleanOperations


展现效果5

操作拆解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))

参考:UnionIntersectionExclusion

代码实践5

代码实践5

技能训练5

单独整理到此【建设中】

本系列目录【new】

Manim文档及源码笔记-CE文档-示例库1基本概念【本文】
Manim文档及源码笔记-CE文档-示例库2动画
Manim文档及源码笔记-CE文档-示例库3使用Manim绘图
Manim文档及源码笔记-CE文档-示例库4特殊摄像机设置
Manim文档及源码笔记-CE文档-示例库5进阶项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值