跳转至

Mobjects

影片代码
import manimgx as m


class MobjectsHero(m.Scene):
    def construct(self) -> None:
        def curve(x: float) -> float:
            return 0.5 * x**2

        axes = m.Axes(x_range=[-2, 2, 1], y_range=[0, 2, 1], x_length=3.2, y_length=2.2)
        graph = axes.plot(curve, color=m.BLUE)
        kinds = m.VGroup(
            m.Square(color=m.BLUE, fill_opacity=0.5),
            m.Star(color=m.YELLOW, fill_opacity=0.5),
            m.Arrow(m.LEFT, m.RIGHT, color=m.GREEN),
            m.Text("Text", font_size=64),
            m.MathTex(r"e^{i\pi} + 1 = 0", font_size=56),
            m.VGroup(axes, graph),
        )
        kinds.arrange_in_grid(rows=2, buff=(1.2, 1))
        self.play(
            m.LaggedStart(
                *[m.FadeIn(kind, shift=0.3 * m.UP) for kind in kinds], lag_ratio=0.15
            )
        )
        self.wait()

mobject 是视频所展示的任何东西:一个形状、一段文本、一个公式、一张图表。创建 mobject 并不会显示它:将其添加到场景中,或播放一段 将其引入的动画。

每个 mobject 都有三样东西:

  • 点,决定其位置和形状。点以单位度量:画面的短边为 8 个单位,其中心为点 [0, 0, 0]。
  • 样式:其描边和填充的颜色与不透明度。
  • 组成部分,它们也是 mobject:一个分组的成员、一个公式的项、一个图表的坐标轴。 你对 mobject 所做的操作,也会作用于其所有组成部分。

无论何种类型,每个 mobject 都能完成前面几页所述的操作:放置、调整尺寸和旋转、设置样式、 分组和复制。随后的几页介绍每种类型的 mobject。

每个 mobject 都能做什么

  • 位置


    点与方向,以及放置 mobject 的方法:在某一点、依据另一个 mobject、在画面边缘。

  • 尺寸与角度


    缩放、拉伸、旋转和翻转 mobject,或通过函数移动每个点。

  • 样式


    描边与填充、颜色与不透明度、渐变,以及覆盖关系。

  • 颜色


    命名颜色,以及创建、混合和选择颜色的函数。

  • 分组


    由 mobject 组成的 mobject:添加、移除、排列和排序组成部分。

  • 副本与状态


    复制 mobject,保留其状态以便返回,以及准备一个要移动到的状态。

  • 路径


    构成形状的曲线:绘制自定义路径,并沿路径查找点。

mobject 的类型

  • 形状


    线与箭头、圆与弧、多边形,以及由其他形状构成的形状。

  • 标注


    大括号、标签、边框、下划线和角度标记:指向其他 mobject 的元素。

  • 文本与数学


    由 Typst 在 ManimGX 中排版的文字、公式和数字。

  • 图表


    坐标轴、数轴和平面、函数与数据的图形、向量场。

  • 网络


    由边连接的顶点,自动布局,可增长和变化。

  • 矩阵与表格


    按行列排列的元素,位于括号或线条之间。

  • 图像与 SVG


    来自文件或像素的图片,以及从 SVG 文件读取的绘图。

  • 点云


    以点形式绘制的 mobject,每个点都是其自身颜色的圆点。

mobject

Mobject

场景中一切事物由之构成的对象:形状、文本、组、跟踪器。

mobject 拥有以场景坐标表示的点(x 向右,y 向上,z 向屏幕外;画框短边为 8 个单位, 16:9 时约为 14.2 × 8,以原点为中心); 子 mobject,即随其绘制和移动的树;样式:其填充、描边及其颜色;更新器,随时间推移 改变它;以及 z 索引,即其在绘制顺序中的位置。你通过其子类创建一个 mobject—— Circle、Text、VGroup 等—— 它们都共享这里的方法:变换它(shift、 scale、rotate),排列它 (next_to、arrange), 设置样式(set_color),保持更新 (add_updater),以及为以上任何操作制作动画 (animate)。

变换或样式作用于 mobject 的整个家族——该 mobject、其子 mobject、它们的子 mobject, 依此类推——并返回该 mobject,因此调用可以链式书写: Square().scale(2).set_color(BLUE)。尺寸和布局依据 mobject 的 边界框:即围绕其绘制内容、与坐标轴对齐的最小框。

m.Mobject(**kwargs)
color

填充与描边共用的颜色(默认白色);None 表示该类的默认值。

fill_color

填充的颜色;未给出时为 color。多个颜色沿 sheen_direction 构成渐变。

fill_opacity

填充的不透明度,取值从 0 到 1(默认 0:无填充)。

stroke_color

描边的颜色;未给出时为 color。多个颜色构成渐变。

stroke_opacity

描边的不透明度,取值从 0 到 1(默认 1)。

stroke_width

描边的宽度,以场景单位的百分之一计(默认 4;0:无描边)。

background_stroke_color

绘制于填充之后的轮廓颜色(默认黑色)。

background_stroke_opacity

轮廓的不透明度,取值从 0 到 1(默认 1)。

background_stroke_width

轮廓的宽度,以场景单位的百分之一计(默认 0:无)。

sheen_factor

颜色朝 sheen_direction 变亮的程度,取值从 -1 到 1(默认 0); 负值变暗。

sheen_direction

颜色变亮的方向(默认 UL)。

joint_type

描边在路径转折处的连接方式:圆角、斜切或斜接,按二维场景的绘制方式 (参见 LineJointType;默认 AUTO:斜接)。

cap_style

描边在其显示的每一端的端点样式(开放路径的端点、虚线的端点):圆头、平头 或方头,按二维场景的绘制方式(参见 CapStyleType;默认 AUTO:平头)。

shade_in_3d

三维场景的光是否对该 mobject 着色。

material

其表面在三维场景中如何反射场景的光(参见 Material);None:Manim 的着色(默认)。

name

mobject 的名称;未给出时为其类名。

z_index

其在绘制顺序中的位置:索引较高者绘制于较低者之上 (默认 0)。

target

MoveToTarget 将 mobject 移动至的状态。

还接受 样式关键字。

源码

manimgx\mobject.py

def __init__(self, **kwargs: Unpack[Style]) -> None:
    if (
        "color" in kwargs and kwargs["color"] is None
    ):  # not given: the class's default
        del kwargs["color"]
    self.style = style_defaults(type(self)) | kwargs
    """待定的构造器样式,包括类的默认值。基础颜色初始化会消耗此实例条目;
    当前外观保存在 [paint][manimgx.Mobject.paint] 中。点云保留其默认值供后续点使用。"""
    name = self.style.get("name")
    self.name = type(self).__name__ if name is None else name
    """mobject 的名称:其类的名称,除非创建时指定了名称。"""
    self.dim = 3
    """其每个点拥有的坐标数:3。"""
    self.target: Mobject | None = self.style.get("target")
    """[MoveToTarget][manimgx.MoveToTarget] 将 mobject 移动到的状态:由
    [generate_target][manimgx.Mobject.generate_target] 创建,或在创建 mobject 时给定;
    若两者皆无则为 None。"""
    self.z_index = self.style.get("z_index", 0.0)
    """mobject 在绘制顺序中的位置:索引值较高的绘制在索引值较低的之上
    (默认 0);参见 [set_z_index][manimgx.Mobject.set_z_index]。"""
    self.submobjects: list[Mobject] = []
    """mobject 的子对象,按绘制顺序排列:在相同 z 索引下,每个绘制在之前的之上。"""
    self.updaters: list[Updater[Self]] = []
    """mobject 自身的更新器,按运行顺序排列;参见
    [add_updater][manimgx.Mobject.add_updater]。"""
    self.updating_suspended = False
    """mobject 的更新器是否被暂停;参见
    [suspend_updating][manimgx.Mobject.suspend_updating]。"""
    self.paint = _UNPAINTED
    """mobject 自身当前的样式,作为一个值:其颜色、不透明度、
    描边宽度和光泽。样式方法会替换它;它永远不会被就地修改。"""
    self.reset_points()
    self.generate_points()
    self.init_colors()

submobjects

mobject 的子对象,按绘制顺序排列:在相同 z 索引下,每个绘制在之前的之上。

name

mobject 的名称:其类的名称,除非创建时指定了名称。