跳转至

分组

影片代码
import manimgx as m


class GroupsHero(m.Scene):
    def construct(self) -> None:
        shapes = m.VGroup(
            m.Circle(color=m.BLUE, fill_opacity=0.5),
            m.Square(color=m.GREEN, fill_opacity=0.5),
            m.Triangle(color=m.YELLOW, fill_opacity=0.5),
            m.Star(color=m.RED, fill_opacity=0.5),
        )
        shapes.arrange(buff=0.6)
        self.play(m.LaggedStart(*[m.Create(shape) for shape in shapes], lag_ratio=0.2))
        self.play(shapes.animate.arrange_in_grid(rows=2, buff=0.6))
        self.play(shapes.animate.arrange(m.DOWN, buff=0.3).scale(0.6))
        self.play(shapes.animate.set_color(m.TEAL))
        self.wait()

mobject 可以持有其他 mobject,即其组成部分。分组不持有其他任何东西:其组成部分就是它所 展示的内容。移动、缩放、着色或动画化一个分组,每个组成部分都会随之变化。

m.VGroup 和 m.Group 是同一个类的两个名称:Manim CE 的代码中两者都有使用。分组是其 组成部分的列表:group[0] 是第一个,group[1:3] 是由第二个和第三个组成的分组, len(group) 计数其数量,for part in group: 遍历它们。每个 mobject 的组成部分都以相同 方式工作:公式的项、图表的坐标轴。

Group

代码
import manimgx as m


class GroupExample(m.Scene):
    def construct(self) -> None:
        shapes = m.Group(
            m.Circle(color=m.BLUE), m.Square(color=m.GREEN), m.Triangle()
        ).arrange(buff=1)
        self.play(m.Create(shapes))
        self.play(shapes.animate.scale(1.5).set_fill(opacity=0.5))
        self.play(shapes[1].animate.shift(m.UP))

将各种类型的 mobject 组合在一起:路径、文本、图像、点云、其他组。

组没有自身的点:其成员即其子 mobject,对组执行的任何操作—— 移动、缩放、设置样式、动画——都作用于其所有成员。 VGroup 是其另一个名称。组可以被索引(group[0])、切片(group[1:3] 是这些 成员的新组)和迭代,group + mobject、group - mobject、+= 和 -= 添加和移除成员。

其成员类型从创建时所用的内容推断;旨在容纳多种 类型的组声明一次,如 Group[Mobject](…),而 Group[Integer](…) 仅容纳整数, 因此 group[0] 对类型检查器是 Integer。

m.Group(*mobjects, **kwargs)
*mobjects

成员,按绘制顺序:mobject 或 mobject 的可迭代对象 (其中每个 mobject 为一个成员)。

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, *mobjects: Mobject | Iterable[Mobject], **kwargs: Unpack[Style]
) -> None:
    super().__init__(**kwargs)
    Mobject.add(self, *_members(mobjects))

submobjects

组的成员,按绘制顺序排列。

add

在组已有成员之后添加成员:mobject 或 mobject 的可迭代对象 (其中每个 mobject 为一个成员)。

已在组中的成员移至末尾。添加非 mobject 的对象,或 将组添加到自身,抛出异常。

group.add(*mobjects)
*mobjects

要添加的成员,按顺序排列。

源码

manimgx\mobject.py

def add(  # pyright: ignore[reportIncompatibleMethodOverride]  # ty: ignore[invalid-method-override]  # a Group[T] adds T
    self, *mobjects: T | Iterable[T]
) -> Self:
    """在组已有成员之后添加成员:mobject 或 mobject 的可迭代对象
    (其中每个 mobject 为一个成员)。

    已在组中的成员移至末尾。添加非 mobject 的对象,或
    将组添加到自身,抛出异常。

    Args:
        *mobjects: 要添加的成员,按顺序排列。
    """
    return super().add(*_members(mobjects))

m.VGroup

Group 的另一个名称,可容纳任何类型的 mobject。

添加与移除组成部分

add_to_back

在 mobject 已有的子 mobject 之前添加子 mobject:它们绘制在之前的 之下(在相同 z 索引下)。

已经是子 mobject 的会移到前面;add 拒绝的操作,此方法同样拒绝。

mobject.add_to_back(*mobjects)
*mobjects

要添加的 mobject,按顺序排列。

源码

manimgx\mobject.py

def add_to_back(self, *mobjects: "Mobject") -> Self:
    """在 mobject 已有的子 mobject 之前添加子 mobject:它们绘制在之前的
    之下(在相同 z 索引下)。

    已经是子 mobject 的会移到前面;`add` 拒绝的操作,此方法同样拒绝。

    Args:
        *mobjects: 要添加的 mobject,按顺序排列。
    """
    return self._place(0, mobjects)

insert

在 mobject 的其他子 mobject 之间某处插入一个子 mobject。

已经是子 mobject 的会移到该位置;add 拒绝的操作,此方法同样拒绝。

mobject.insert(index, mobject)
index

其在其他子 mobject 列表中的位置,与 list.insert 接受的方式相同。

mobject

要插入的 mobject。

源码

manimgx\mobject.py

def insert(self, index: int, mobject: "Mobject") -> Self:
    """在 mobject 的其他子 mobject 之间某处插入一个子 mobject。

    已经是子 mobject 的会移到该位置;`add` 拒绝的操作,此方法同样拒绝。

    Args:
        index: 其在其他子 mobject 列表中的位置,与 `list.insert`
            接受的方式相同。
        mobject: 要插入的 mobject。
    """
    return self._place(index, (mobject,))

remove

移除子 mobject:在 mobject 自身的子 mobject 中(而非其子 mobject 的子 mobject 中) 与给定者匹配的那些;其余的被忽略。

mobject.remove(*mobjects)
*mobjects

要移除的 mobject。

源码

manimgx\mobject.py

def remove(self, *mobjects: "Mobject") -> Self:
    """移除子 mobject:在 mobject 自身的子 mobject 中(而非其子 mobject 的子 mobject 中)
    与给定者匹配的那些;其余的被忽略。

    Args:
        *mobjects: 要移除的 mobject。
    """
    for m in mobjects:
        if m in self.submobjects:
            self.submobjects.remove(m)
    return self

get_family

mobject 及其所有后代:自身,然后依次是每个子 mobject 的家族, 每个成员出现一次(若树中持有它两次,则在其最后出现的位置)。

mobject.get_family()

返回 一个新列表。

源码

manimgx\mobject.py

def get_family(self) -> list["Mobject"]:
    """mobject 及其所有后代:自身,然后依次是每个子 mobject 的家族,
    每个成员出现一次(若树中持有它两次,则在其最后出现的位置)。

    Returns:
        一个新列表。
    """
    if not self.submobjects:
        return [self]
    return _family((self,))

family_members_with_points

mobject 家族中拥有自身点的成员:即被绘制的那些。

mobject.family_members_with_points()

返回 一个新列表,按家族顺序排列。

源码

manimgx\mobject.py

def family_members_with_points(self) -> list["Mobject"]:
    """mobject 家族中拥有自身点的成员:即被绘制的那些。

    Returns:
        一个新列表,按家族顺序排列。
    """
    return [m for m in self.get_family() if m.has_points()]

排列组成部分

arrange

MobjectArrangeExample
代码
import manimgx as m


class MobjectArrangeExample(m.Scene):
    def construct(self) -> None:
        sizes = (0.5, 1, 2)
        squares = m.VGroup(*(m.Square(s, color=m.BLUE) for s in sizes))
        squares.arrange(buff=0.5, aligned_edge=m.DOWN)
        words = m.VGroup(m.Text("one"), m.Text("three"), m.Text("eleven"))
        words.arrange(m.DOWN, aligned_edge=m.LEFT)
        self.add(m.VGroup(squares, words).arrange(buff=1.5))

将子 mobject 排成一行:每个在前一个旁边(参见 next_to),间距 buff;然后将整体居中于 原点。

mobject.arrange(direction=RIGHT, buff=DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, center=True, **kwargs)
direction

行的方向:RIGHT(默认),DOWN 表示列,…

buff

相邻者之间的间距,以场景单位表示(默认 0.25)。

center

之后是否将 mobject 居中于原点;若否, 第一个子 mobject 保持原位。

aligned_edge

两个对象在它们相遇侧旁对齐所沿的边,以方向表示:当方向为 RIGHT 和 UP 时, 它们的顶部对齐(默认 ORIGIN:居中)。

submobject_to_align

要放在另一对象旁边的 mobject 的一部分,代替其位置;其余部分随其移动 (默认 None:整个 mobject)。

index_of_submobject_to_align

每个 mobject 中要对齐部分的索引:此对象的部分放在另一对象的部分旁边 (默认 None:各自的全部)。

coor_mask

哪些坐标可以改变:mobject 沿其移动的每个轴为 1,保持不变的轴为 0 (默认 (1, 1, 1))。

源码

manimgx\mobject.py

def arrange(
    self,
    direction: Vector3DLike = RIGHT,
    buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER,
    center: bool = True,
    **kwargs: Unpack[Beside],
) -> Self:
    """将子 mobject 排成一行:每个在前一个旁边(参见
    [next_to][manimgx.Mobject.next_to]),间距 `buff`;然后将整体居中于
    原点。

    Args:
        direction: 行的方向:RIGHT(默认),DOWN 表示列,…
        buff: 相邻者之间的间距,以场景单位表示(默认 0.25)。
        center: 之后是否将 mobject 居中于原点;若否,
            第一个子 mobject 保持原位。
        **kwargs: [Beside 关键字][manimgx.mobject.Beside]:相邻者如何
            对齐(`aligned_edge=DOWN` 使它们的底部在一条线上)。

    Examples:
        ```python
        import manimgx as m


        class MobjectArrangeExample(m.Scene):
            def construct(self) -> None:
                sizes = (0.5, 1, 2)
                squares = m.VGroup(*(m.Square(s, color=m.BLUE) for s in sizes))
                squares.arrange(buff=0.5, aligned_edge=m.DOWN)
                words = m.VGroup(m.Text("one"), m.Text("three"), m.Text("eleven"))
                words.arrange(m.DOWN, aligned_edge=m.LEFT)
                self.add(m.VGroup(squares, words).arrange(buff=1.5))
        ```
    """
    for m1, m2 in zip(self.submobjects[:-1], self.submobjects[1:], strict=True):
        m2.next_to(m1, direction, buff, **kwargs)
    return self.center() if center else self

arrange_in_grid

MobjectArrangeInGridExample
代码
import manimgx as m


def cells() -> m.VGroup:
    return m.VGroup(
        *(
            m.Square(0.9, color=m.BLUE).add(m.Text(str(i), font_size=36))
            for i in range(1, 11)
        )
    )


class MobjectArrangeInGridExample(m.Scene):
    def construct(self) -> None:
        by_rows = cells().arrange_in_grid(rows=3, buff=0.2)
        by_cols = cells().arrange_in_grid(rows=3, buff=0.2, flow_order="dr")
        self.add(m.VGroup(by_rows, by_cols).arrange(buff=1.5))

将子 mobject 排成行列网格,居中于 mobject 原来的位置。

每行与其最高的 mobject 等高,每列与其最宽的 mobject 等宽,除非另行指定。 每个 mobject 按 cell_alignment 所示位于其单元格中, 但垂直方向按 row_alignments 为其行所示,水平方向按 col_alignments 为其列所示,在已指定的地方。行和列太少 无法容纳所有子 mobject 时抛出异常。

mobject.arrange_in_grid(rows=None, cols=None, buff=MED_SMALL_BUFF, cell_alignment=ORIGIN, row_alignments=None, col_alignments=None, row_heights=None, col_widths=None, flow_order='rd')
rows

行数;None 表示与 row_alignments 或 row_heights 列出的数量相同,否则与子 mobject 所需的数量相同。当 rows 和 cols 均未指定时,网格尽可能呈正方形。

cols

列数;None 表示与 col_alignments 或 col_widths 列出的数量相同,否则与子 mobject 所需的数量相同。

buff

单元格之间的间距,以场景单位表示:两个方向共用一个值,或 (水平, 垂直)(默认 0.25)。

cell_alignment

每个 mobject 在其单元格中的位置,以方向命名: UL 表示其左上角(默认 ORIGIN:居中)。

row_alignments

每行的垂直对齐方式,从上到下:每行一个 字母,"u"(上)、"c"(居中)或 "d"(下);None:按 cell_alignment 的垂直部分所示(UL:上)。

col_alignments

每列的水平对齐方式,从左到右:每列一个 字母,"l"(左)、"c"(居中)或 "r"(右);None:按 cell_alignment 的水平部分所示(UL:左)。

row_heights

每行的高度,从上到下,以场景单位表示;None(对于 网格或某行)表示该行最高 mobject 的高度。

col_widths

每列的宽度,从左到右,以场景单位表示;None(对于 网格或某列)表示该列最宽 mobject 的宽度。

flow_order

单元格的填充顺序:两个字母,一行单元格的填充方向, 随后是各行彼此跟随的方向, "r"(右)、"l"(左)、"u"(上)或 "d"(下)。默认 "rd" 表示 行从左到右,从上到下;"dr" 表示列从上到下, 从左到右。

源码

manimgx\mobject.py

def arrange_in_grid(
    self,
    rows: int | None = None,
    cols: int | None = None,
    buff: float | tuple[float, float] = MED_SMALL_BUFF,
    cell_alignment: Vector3DLike = ORIGIN,
    row_alignments: str | None = None,
    col_alignments: str | None = None,
    row_heights: Iterable[float | None] | None = None,
    col_widths: Iterable[float | None] | None = None,
    flow_order: str = "rd",
) -> Self:
    """将子 mobject 排成行列网格,居中于 mobject 原来的位置。

    每行与其最高的 mobject 等高,每列与其最宽的 mobject 等宽,除非另行指定。
    每个 mobject 按 `cell_alignment` 所示位于其单元格中,
    但垂直方向按 `row_alignments` 为其行所示,水平方向按
    `col_alignments` 为其列所示,在已指定的地方。行和列太少
    无法容纳所有子 mobject 时抛出异常。

    Args:
        rows: 行数;None 表示与 `row_alignments` 或 `row_heights`
            列出的数量相同,否则与子 mobject 所需的数量相同。当 `rows` 和
            `cols` 均未指定时,网格尽可能呈正方形。
        cols: 列数;None 表示与 `col_alignments` 或 `col_widths`
            列出的数量相同,否则与子 mobject 所需的数量相同。
        buff: 单元格之间的间距,以场景单位表示:两个方向共用一个值,或
            (水平, 垂直)(默认 0.25)。
        cell_alignment: 每个 mobject 在其单元格中的位置,以方向命名:
            UL 表示其左上角(默认 ORIGIN:居中)。
        row_alignments: 每行的垂直对齐方式,从上到下:每行一个
            字母,"u"(上)、"c"(居中)或 "d"(下);None:按
            `cell_alignment` 的垂直部分所示(UL:上)。
        col_alignments: 每列的水平对齐方式,从左到右:每列一个
            字母,"l"(左)、"c"(居中)或 "r"(右);None:按
            `cell_alignment` 的水平部分所示(UL:左)。
        row_heights: 每行的高度,从上到下,以场景单位表示;None(对于
            网格或某行)表示该行最高 mobject 的高度。
        col_widths: 每列的宽度,从左到右,以场景单位表示;None(对于
            网格或某列)表示该列最宽 mobject 的宽度。
        flow_order: 单元格的填充顺序:两个字母,一行单元格的填充方向,
            随后是各行彼此跟随的方向,
            "r"(右)、"l"(左)、"u"(上)或 "d"(下)。默认 "rd" 表示
            行从左到右,从上到下;"dr" 表示列从上到下,
            从左到右。

    Examples:
        ```python
        import manimgx as m


        def cells() -> m.VGroup:
            return m.VGroup(
                *(
                    m.Square(0.9, color=m.BLUE).add(m.Text(str(i), font_size=36))
                    for i in range(1, 11)
                )
            )


        class MobjectArrangeInGridExample(m.Scene):
            def construct(self) -> None:
                by_rows = cells().arrange_in_grid(rows=3, buff=0.2)
                by_cols = cells().arrange_in_grid(rows=3, buff=0.2, flow_order="dr")
                self.add(m.VGroup(by_rows, by_cols).arrange(buff=1.5))
        ```
    """
    mobs = list(self.submobjects)
    start_pos = self.get_center()
    heights_in = list(row_heights) if row_heights is not None else None
    widths_in = list(col_widths) if col_widths is not None else None
    cols = cols or (
        len(col_alignments)
        if col_alignments
        else len(widths_in)
        if widths_in
        else None
    )
    rows = rows or (
        len(row_alignments)
        if row_alignments
        else len(heights_in)
        if heights_in
        else None
    )
    if rows is None:
        cols = math.ceil(math.sqrt(len(mobs))) if cols is None else cols
        rows = math.ceil(len(mobs) / cols)
    elif cols is None:
        cols = math.ceil(len(mobs) / rows)
    if rows * cols < len(mobs):
        raise ValueError("Too few rows and columns to fit all submobjetcs.")
    bx, by = buff if isinstance(buff, tuple) else (buff, buff)
    cell = np.asarray(cell_alignment, dtype=float)
    rdirs = (  # a row aligns its cells vertically, a column horizontally
        [cell * UP] * rows
        if row_alignments is None
        else [{"u": UP, "c": ORIGIN, "d": DOWN}[c] for c in row_alignments]
    )
    cdirs = (
        [cell * RIGHT] * cols
        if col_alignments is None
        else [{"l": LEFT, "c": ORIGIN, "r": RIGHT}[c] for c in col_alignments]
    )
    index = {
        "dr": lambda r, c: rows - r - 1 + c * rows,
        "dl": lambda r, c: rows - r - 1 + (cols - c - 1) * rows,
        "ur": lambda r, c: r + c * rows,
        "ul": lambda r, c: r + (cols - c - 1) * rows,
        "rd": lambda r, c: (rows - r - 1) * cols + c,
        "ld": lambda r, c: (rows - r - 1) * cols + (cols - c - 1),
        "ru": lambda r, c: r * cols + c,
        "lu": lambda r, c: r * cols + (cols - c - 1),
    }[flow_order]
    rdirs.reverse()
    heights_given = list(reversed(heights_in)) if heights_in else [None] * rows
    placeholder = Mobject()
    mobs.extend([placeholder] * (rows * cols - len(mobs)))
    grid = [[mobs[index(r, c)] for c in range(cols)] for r in range(rows)]
    heights = [
        h if h is not None else max(grid[r][c].height for c in range(cols))
        for r, h in enumerate(heights_given)
    ]
    widths = [
        w if w is not None else max(grid[r][c].width for r in range(rows))
        for c, w in enumerate(widths_in or [None] * cols)
    ]
    y = 0.0
    for r in range(rows):
        x = 0.0
        for c in range(cols):
            if grid[r][c] is not placeholder:
                lo, hi = (
                    np.array([x, y, 0.0]),
                    np.array([x + widths[c], y + heights[r], 0.0]),
                )
                align = rdirs[r] + cdirs[c]
                corner = np.where(
                    align < 0, lo, np.where(align > 0, hi, (lo + hi) / 2)
                )
                grid[r][c].move_to(corner, align)
            x += widths[c] + bx
        y += heights[r] + by
    return self.move_to(start_pos)

排序组成部分

sort

按数字排序子 mobject:从每个子 mobject 的中心计算(默认 为其 x 坐标,即从左到右),或从每个子 mobject 本身计算。

它们的顺序即绘制顺序(在相同 z 索引下),也是 lag_ratio 错开其动画的顺序。

mobject.sort(point_to_num_func=lambda p: p[0], submob_func=None)
point_to_num_func

关于子 mobject 中心的函数,给出排序 所依据的数字。

submob_func

关于子 mobject 的函数,给出排序所依据的数字, 替代 point_to_num_func。

源码

manimgx\mobject.py

def sort(
    self,
    point_to_num_func: Callable[[Point3D], float] = lambda p: p[0],
    submob_func: Callable[["Mobject"], float] | None = None,
) -> Self:
    """按数字排序子 mobject:从每个子 mobject 的中心计算(默认
    为其 x 坐标,即从左到右),或从每个子 mobject 本身计算。

    它们的顺序即绘制顺序(在相同 z 索引下),也是
    `lag_ratio` 错开其动画的顺序。

    Args:
        point_to_num_func: 关于子 mobject 中心的函数,给出排序
            所依据的数字。
        submob_func: 关于子 mobject 的函数,给出排序所依据的数字,
            替代 `point_to_num_func`。
    """
    key = submob_func or (lambda m: point_to_num_func(m.get_center()))
    self.submobjects.sort(key=key)
    return self

shuffle

将子 mobject 置于随机顺序,从 Python 的 random 中抽取。

mobject.shuffle(recursive=False)
recursive

每个子 mobject 的子 mobject 是否也被打乱, 以及它们的。

源码

manimgx\mobject.py

def shuffle(self, recursive: bool = False) -> Self:
    """将子 mobject 置于随机顺序,从 Python 的 `random` 中抽取。

    Args:
        recursive: 每个子 mobject 的子 mobject 是否也被打乱,
            以及它们的。
    """
    if recursive:
        for sub in self.submobjects:
            sub.shuffle(recursive=True)
    random.shuffle(self.submobjects)
    return self

invert

反转子 mobject 的顺序。

mobject.invert(recursive=False)
recursive

每个子 mobject 的子 mobject 是否也被反转, 以及它们的。

源码

manimgx\mobject.py

def invert(self, recursive: bool = False) -> Self:
    """反转子 mobject 的顺序。

    Args:
        recursive: 每个子 mobject 的子 mobject 是否也被反转,
            以及它们的。
    """
    if recursive:
        for sub in self.submobjects:
            sub.invert(recursive=True)
    self.submobjects.reverse()
    return self

命名组成部分

VDict

代码
import manimgx as m


class VDictExample(m.Scene):
    def construct(self) -> None:
        shapes = m.VDict(
            {
                "circle": m.Circle(radius=0.9, color=m.RED),
                "square": m.Square(side_length=1.8, color=m.GREEN),
            },
            show_keys=True,
        )
        shapes["triangle"] = m.Triangle(color=m.BLUE)
        self.add(shapes.arrange(buff=1))
        self.play(shapes["square"].animate.set_color(m.YELLOW))

成员带键的组,如同字典:vdict[key] 是一个成员。

任何类型的成员都可按键添加、替换(vdict[key] = mobject)和移除; 如同任何组,它按添加顺序一起绘制、移动和设置样式。使用 show_keys 时, 每个成员以键标注。

m.VDict(mapping_or_iterable={}, show_keys=False, **kwargs)
mapping_or_iterable

初始成员:键和 mobject 的字典,或 (key, mobject) 对。

show_keys

每个成员(现在或以后添加的)是否以键标注: 在其左侧添加 str(key) 的 Tex,加入成员自身, 因此标注随其移动、动画和离开,并计入其尺寸。

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__[Key: Hashable](
    self,
    mapping_or_iterable: (
        Mapping[Key, Mobject] | Iterable[tuple[Key, Mobject]]
    ) = {},
    show_keys: bool = False,
    **kwargs: Unpack[Style],
) -> None:
    super().__init__(**kwargs)
    self.show_keys = show_keys
    self.submob_dict: dict[Hashable, T] = {}
    """成员,按键索引。"""
    self.add(
        mapping_or_iterable  # ty: ignore[invalid-argument-type]  # a VDict[T] is given T
    )

submob_dict

成员,按键索引。

add

按键在组的成员之后添加成员。

若组显示键,每个成员以键标注。组中已有的键被赋予 新的 mobject,但旧的仍留在组中:要替换 成员,请设置它(vdict[key] = mobject)。

vdict.add(mapping_or_iterable)
mapping_or_iterable

键和 mobject 的字典,或 (key, mobject) 对。

源码

manimgx\mobject.py

def add[Key: Hashable](  # pyright: ignore[reportIncompatibleMethodOverride]  # ty: ignore[invalid-method-override]  # CE's: by key
    self, mapping_or_iterable: Mapping[Key, T] | Iterable[tuple[Key, T]]
) -> Self:
    """按键在组的成员之后添加成员。

    若组显示键,每个成员以键标注。组中已有的键被赋予
    新的 mobject,但旧的仍留在组中:要替换
    成员,请设置它(`vdict[key] = mobject`)。

    Args:
        mapping_or_iterable: 键和 mobject 的字典,或 (key, mobject)
            对。
    """
    for key, value in dict(mapping_or_iterable).items():
        self.add_key_value_pair(key, value)
    return self

remove

按键从组中移除成员。

若组中无此键则抛出异常。

vdict.remove(key)
key

成员的键。

源码

manimgx\mobject.py

def remove(  # pyright: ignore[reportIncompatibleMethodOverride]  # ty: ignore[invalid-method-override]  # CE's: by key
    self, key: Hashable
) -> Self:
    """按键从组中移除成员。

    若组中无此键则抛出异常。

    Args:
        key: 成员的键。
    """
    super().remove(self.submob_dict.pop(key))
    return self

index_labels

IndexLabelsExample
代码
import manimgx as m


class IndexLabelsExample(m.Scene):
    def construct(self) -> None:
        formula = m.MathTex(r"\binom{2n}{n+2}", font_size=144)
        formula[0][1:3].set_color(m.YELLOW)
        formula[0][3:6].set_color(m.RED)
        self.add(formula, m.index_labels(formula[0], label_height=0.3))

为一个 mobject 的子对象编号:在每个子对象中心放置一个 Integer,带深色轮廓,用于查找某个部分的索引。

一种调试辅助:将标签添加到场景中即可看到它们;它们不跟随该 mobject。

m.index_labels(mobject, label_height=0.15, **kwargs)
mobject

其子对象从 0 开始编号的 mobject。

label_height

每个标签的高度,以场景单位计。

mob_class

每个字符排版所用的类(默认为 MathTex)。

include_sign

非负数是否带加号书写(默认为 False)。

group_with_commas

小数点前的数字是否按三位一组用逗号分组,如 12,345(默认为 True)。

digit_buff_per_font_unit

字符之间的间距,按字体大小单位计:默认值 0.001 在字体大小 48 时为 0.048 个场景单位。

show_ellipsis

数字后是否跟"…",用于表示持续变化的值(默认为 False)。

unit

数字后的单位,以 LaTeX 数学表示:"^\circ" 表示度,r"\text{ m}" 表示米; 以 "^" 开头的单位会提升到数字的顶部(默认为 None)。

unit_buff_per_font_unit

单位前的间距,超出字符间距之外的部分,按字体大小单位计(默认为 0)。

include_background_rectangle

数字后是否有背景矩形(默认为 False)。

edge_to_fix

当新值改变数字宽度时保持不动的边缘,以方向表示(默认为 LEFT:向右生长)。

font_size

字符的字体大小,以 mob_class 的度量方式计(默认为 48)。

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\mobjects\numbers.py

def index_labels(
    mobject: Mobject, label_height: float = 0.15, **kwargs: Unpack[NumberStyle]
) -> VGroup:
    r"""为一个 mobject 的子对象编号:在每个子对象中心放置一个
    [Integer][manimgx.Integer],带深色轮廓,用于查找某个部分的索引。

    一种调试辅助:将标签添加到场景中即可看到它们;它们不跟随该 mobject。

    Args:
        mobject: 其子对象从 0 开始编号的 mobject。
        label_height: 每个标签的高度,以场景单位计。
        **kwargs: [数字关键字][manimgx.mobjects.numbers.NumberStyle](除非给定,
            否则使用宽度为 5 的黑色背景描边)。

    Returns:
        由标签按顺序组成的新组。

    Examples:
        ```python
        import manimgx as m


        class IndexLabelsExample(m.Scene):
            def construct(self) -> None:
                formula = m.MathTex(r"\binom{2n}{n+2}", font_size=144)
                formula[0][1:3].set_color(m.YELLOW)
                formula[0][3:6].set_color(m.RED)
                self.add(formula, m.index_labels(formula[0], label_height=0.3))
        ```
    """
    kwargs.setdefault("background_stroke_width", 5)
    kwargs.setdefault("background_stroke_color", BLACK)
    labels = VGroup()
    for n, submob in enumerate(mobject):
        label = Integer(n, **kwargs)
        label.height = label_height
        labels.add(label.move_to(submob))
    return labels

Beside

next_to 如何将一个 mobject 对齐到另一个旁边:其关键字, 但不包括方向和间距,供传递它们的类使用 (arrange)。

aligned_edge

两个对象在它们相遇侧旁对齐所沿的边,以方向表示:当方向为 RIGHT 和 UP 时, 它们的顶部对齐(默认 ORIGIN:居中)。

submobject_to_align

要放在另一对象旁边的 mobject 的一部分,代替其位置;其余部分随其移动 (默认 None:整个 mobject)。

index_of_submobject_to_align

每个 mobject 中要对齐部分的索引:此对象的部分放在另一对象的部分旁边 (默认 None:各自的全部)。

coor_mask

哪些坐标可以改变:mobject 沿其移动的每个轴为 1,保持不变的轴为 0 (默认 (1, 1, 1))。

NumberStyle

数字的书写方式:DecimalNumber 的关键字,但不包括 其小数位数,供传递这些关键字的类使用。

除此之外,它们还接受样式关键字。

mob_class

每个字符排版所用的类(默认为 MathTex)。

include_sign

非负数是否带加号书写(默认为 False)。

group_with_commas

小数点前的数字是否按三位一组用逗号分组,如 12,345(默认为 True)。

digit_buff_per_font_unit

字符之间的间距,按字体大小单位计:默认值 0.001 在字体大小 48 时为 0.048 个场景单位。

show_ellipsis

数字后是否跟"…",用于表示持续变化的值(默认为 False)。

unit

数字后的单位,以 LaTeX 数学表示:"^\circ" 表示度,r"\text{ m}" 表示米; 以 "^" 开头的单位会提升到数字的顶部(默认为 None)。

unit_buff_per_font_unit

单位前的间距,超出字符间距之外的部分,按字体大小单位计(默认为 0)。

include_background_rectangle

数字后是否有背景矩形(默认为 False)。

edge_to_fix

当新值改变数字宽度时保持不动的边缘,以方向表示(默认为 LEFT:向右生长)。

font_size

字符的字体大小,以 mob_class 的度量方式计(默认为 48)。

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 移动至的状态。