Mobject¶
全限定名:manim.mobject.mobject.Mobject
- class Mobject(color=ManimColor('#FFFFFF'), name=None, dim=3, target=None, z_index=0)[source]¶
基类:
object
数学对象:可在屏幕上显示的对象的基础类。
存在一个兼容层,允许使用
get_*
和set_*
方法获取和设置通用属性。有关更多详细信息,请参见set()
。- 参数:
color (ParsableManimColor | list[ParsableManimColor])
name (str | None)
dim (int)
z_index (float)
方法
添加 mobject 作为子对象。
添加动画覆盖。
添加一个 BackgroundRectangle 作为子对象。
为具有点的家族成员添加背景矩形
为子对象添加背景矩形
添加 n 个更多子对象
将所有传入的 mobject 添加到子对象的背面。
为此 mobject 添加一个更新函数。
将此 mobject 的数据与另一个 mobject 对齐。
方向只需是指向二维平面中边或角的向量。
对齐点
与较大的对齐点
对齐子对象
在某个方向上将 mobject 与另一个
Mobject
对齐。返回为此类定义特定动画覆盖的函数。
将复函数应用于
Mobject
。应用函数
将函数应用于位置
将函数应用于子对象位置
应用矩阵
跨属性数组应用
围绕点应用点函数
递归地将函数应用于
self
和每个具有点的子对象。在屏幕上将
Mobject
彼此相邻排列。在网格中排列子对象。
用小缓冲区排列
submobjects
的位置。编辑点、颜色和子对象,使其与另一个
Mobject
相同将 mobject 的中心移动到场景中心。
移除所有更新器。
创建并返回
Mobject
的完全相同的副本,包括所有submobjects
。淡化
淡化到
具有点的家族成员
围绕其中心翻转/镜像 mobject。
初始化
points
,从而初始化形状。生成目标
返回此 mobject 和所有子对象的所有点。
获取数组属性
获取包围
Mobject
的框的底部 Point3D。获取边界点
获取中心 Point3D。
获取质心
返回
Mobject
的颜色。旨在泛化
get_x
、get_y
和get_z
。获取特定方向的角点 Point3D。
想象一个包围
Mobject
的框。获取特定方向的边缘 Point3D。
返回包围
Mobject
的笔划的结束点。沿维度获取极值
获取家族
获取家族更新器
获取组类
获取图像
获取包围
Mobject
的框的左侧 Point3D。返回此 mobject 和所有子对象中给定属性的所有值。
获取形成
Mobject
路径中点的 Point3D。返回此 mobject 类型的基类。
获取包围 3D
Mobject
的框的最低点(与顶点相对)Point3D。获取点数
获取片段
转换为或从 self 转换的最简单的
Mobject
。获取定义边界的点
获取包围
Mobject
的框的右侧 Point3D。返回包围
Mobject
的笔划的起始点。将笔划的起始点和结束点作为
tuple
返回。返回所有使用
dt
参数的更新器。获取包围
Mobject
的框的顶部 Point3D。返回所有更新器。
将
Mobject
中心的 x Point3D 作为float
返回。将
Mobject
中心的 y Point3D 作为float
返回。将
Mobject
中心的 z Point3D 作为float
返回。获取 z 索引参考点
获取包围 3D
Mobject
的框的顶点 Point3D。检查
Mobject
是否不包含点。检查
Mobject
是否包含点。测试
self
是否有基于时间的更新器。初始化颜色。
将 mobject 插入到 self.submobjects 中的特定位置。
将此
Mobject
变为mobject1
和mobject2
之间的插值。插值颜色
反转
submobjects
列表。在屏幕外
测量
Mobject
在特定方向上的长度。使颜色与另一个
Mobject
的颜色匹配。使 Point3D 与另一个
Mobject
的 Point3D 匹配。使深度与另一个
Mobject
的深度匹配。使指定维度与另一个
Mobject
的维度匹配。使高度与另一个
Mobject
的高度匹配。编辑点、位置和子对象,使其与另一个
Mobject
相同,同时保持样式不变。匹配给定 mobject 的更新器。
使宽度与另一个
Mobject
的宽度匹配。匹配 x 坐标。
匹配 y 坐标。
匹配 z 坐标。
将
Mobject
的中心移动到特定 Point3D。非空子对象
如果一个有点的
Mobject
与一个没有点的Mobject
对齐,则将两者都视为组,并将有点的那个推入其自身的子对象列表。从比例获取点
以角度定位
从点获取比例
将自身推入子对象
将起始和结束放在
在此 mobject 和子对象的所有点中,查找某个维度的最小值或最大值。
移除
submobjects
。移除更新器。
这可以使过渡动画更流畅。
重复子对象
替换
重新缩放以适应
将
points
设置为空数组。恢复先前使用
save_state()
保存的状态。启用来自更新器和动画的更新。
反转点
围绕某个点旋转
Mobject
。围绕原点([0,0,0])旋转
Mobject
。将其图像以其位置保存到 PNG 文件中。
保存当前状态(位置、颜色和大小)。
按比例因子缩放大小。
缩放
Mobject
以适应某个深度,同时保持宽度/高度比例。缩放
Mobject
以适应某个高度,同时保持宽度/深度比例。缩放
Mobject
以适应某个宽度,同时保持高度/深度比例。设置属性。
条件是一个接受一个参数 (x, y, z) 的函数。
按径向渐变设置颜色
设置坐标
设置关键字参数的默认值。
按渐变为子对象设置颜色
按径向渐变为子对象设置颜色
设置
Mobject
中心的 x 值(int
或float
)。设置
Mobject
中心的 y 值(int
或float
)。设置
Mobject
中心的 z 值(int
或float
)。将
Mobject
的z_index
设置为 z_index_value 中指定的值。将
Mobject
的 z Point3D 设置为z_index
的值。按给定向量平移。
平移到屏幕上
显示
打乱
submobjects
列表。打乱
submobjects
的顺序。根据
submob_func
定义的函数对submobjects
列表进行排序。排序
submobjects
。间隔子对象
分割
拉伸
围绕点拉伸
拉伸
Mobject
以适应某个深度,不保持宽度/高度比例。拉伸
Mobject
以适应某个高度,不保持宽度/深度比例。拉伸
Mobject
以适应某个宽度,不保持高度/深度比例。环绕
禁用来自更新器和动画的更新。
如果没有点则抛出错误
将此
Mobject
移动到屏幕的给定角点。将此
Mobject
移动到屏幕的给定边缘,而不影响其在其他维度上的位置。恢复原始颜色
应用所有更新器。
属性
用于动画化
self
的任何方法的应用。animation_overrides (动画覆盖)
mobject 的深度。
mobject 的高度。
mobject 的宽度。
- classmethod _add_intrinsic_animation_overrides()[source]¶
初始化带有
override_animation()
装饰器标记的动画覆盖。- 返回类型:
无
- _assert_valid_submobjects(submobjects)[source]¶
检查所有子对象是否确实是
Mobject
的实例,并且它们中没有一个是self
(一个Mobject
不能包含自身)。这是一个辅助函数,在将 Mobject 添加到
submobjects
列表时调用。此函数旨在由
VMobject
等子类覆盖,这些子类应断言只能将其他 VMobject 添加到其中。
- add(*mobjects)[source]¶
添加 mobject 作为子对象。
mobject 被添加到
submobjects
。mobject 的子类可以实现
+
和+=
魔法方法。- 参数:
mobjects (Mobject) – 要添加的 mobject。
- 返回:
self
- 返回类型:
- 抛出:
ValueError – 当 mobject 尝试添加自身时。
TypeError – 当尝试添加一个不是
Mobject
实例的对象时。
注意
一个 mobject 不能包含自身,也不能包含一个子对象多次。如果父 mobject 被显示,新添加的子对象也将被显示(即它们会自动添加到父场景中)。
另请参阅
示例
>>> outer = Mobject() >>> inner = Mobject() >>> outer = outer.add(inner)
重复项不会再次添加
>>> outer = outer.add(inner) >>> len(outer.submobjects) 1
只能添加 Mobject
>>> outer.add(3) Traceback (most recent call last): ... TypeError: Only values of type Mobject can be added as submobjects of Mobject, but the value 3 (at index 0) is of type int.
将对象添加到自身会引发错误
>>> outer.add(outer) Traceback (most recent call last): ... ValueError: Cannot add Mobject as a submobject of itself (at index 0).
给定 mobject 不能作为子对象两次添加到某个父级
>>> parent = Mobject(name="parent") >>> child = Mobject(name="child") >>> parent.add(child, child) [...] WARNING ... parent >>> parent.submobjects [child]
- classmethod add_animation_override(animation_class, override_func)[source]¶
添加动画覆盖。
这不适用于子类。
- 参数:
animation_class (type[Animation]) – 要覆盖的动画类型。
override_func (FunctionOverride) – 返回替换默认动画的函数的函数。它会传递给动画构造函数。
- 抛出:
MultiAnimationOverrideException – 如果被覆盖的动画已被覆盖。
- 返回类型:
无
- add_background_rectangle(color=None, opacity=0.75, **kwargs)[source]¶
添加一个 BackgroundRectangle 作为子对象。
BackgroundRectangle 会添加到其他子对象的后面。
这可以用来提高 mobject 在嘈杂背景前的可见性。
- 参数:
color (ParsableManimColor | None) – BackgroundRectangle 的颜色。
opacity (float) – BackgroundRectangle 的不透明度。
kwargs – 传递给 BackgroundRectangle 构造函数的额外关键字参数。
- 返回:
self
- 返回类型:
- add_to_back(*mobjects)[source]¶
将所有传入的 mobject 添加到子对象的背面。
如果
submobjects
已包含给定的 mobject,它们只会移到背面。注意
从技术上讲,这是通过将 mobject 添加(或移动)到
submobjects
的头部来完成的。此列表的头部会首先渲染,这会将相应的 mobject 放置在后续列表成员的后面。- 抛出:
ValueError – 当 mobject 尝试添加自身时。
TypeError – 当尝试添加一个不是
Mobject
实例的对象时。
- 参数:
mobjects (Mobject)
- 返回类型:
自身
注意
一个 mobject 不能包含自身,也不能包含一个子对象多次。如果父 mobject 被显示,新添加的子对象也将被显示(即它们会自动添加到父场景中)。
- add_updater(update_function, index=None, call_updater=False)[source]¶
为此 mobject 添加一个更新函数。
更新函数(简称更新器)是在每一帧中应用于 Mobject 的函数。
- 参数:
- 返回:
self
- 返回类型:
示例
示例:NextToUpdater ¶
from manim import * class NextToUpdater(Scene): def construct(self): def dot_position(mobject): mobject.set_value(dot.get_center()[0]) mobject.next_to(dot) dot = Dot(RIGHT*3) label = DecimalNumber() label.add_updater(dot_position) self.add(dot, label) self.play(Rotating(dot, about_point=ORIGIN, angle=TAU, run_time=TAU, rate_func=linear))
class NextToUpdater(Scene): def construct(self): def dot_position(mobject): mobject.set_value(dot.get_center()[0]) mobject.next_to(dot) dot = Dot(RIGHT*3) label = DecimalNumber() label.add_updater(dot_position) self.add(dot, label) self.play(Rotating(dot, about_point=ORIGIN, angle=TAU, run_time=TAU, rate_func=linear))
示例:DtUpdater ¶
from manim import * class DtUpdater(Scene): def construct(self): square = Square() #Let the square rotate 90° per second square.add_updater(lambda mobject, dt: mobject.rotate(dt*90*DEGREES)) self.add(square) self.wait(2)
class DtUpdater(Scene): def construct(self): square = Square() #Let the square rotate 90° per second square.add_updater(lambda mobject, dt: mobject.rotate(dt*90*DEGREES)) self.add(square) self.wait(2)
- align_data(mobject, skip_point_alignment=False)[source]¶
将此 mobject 的数据与另一个 mobject 对齐。
此后,这两个 mobject 将拥有相同数量的子对象(参见
align_submobjects()
),相同的父结构(参见null_point_align()
)。如果skip_point_alignment
为 False,它们还将拥有相同数量的点(参见align_points()
)。- 参数:
mobject (Mobject) – 此 mobject 应与之对齐的另一个 mobject。
skip_point_alignment (bool) – 控制是否跳过计算成本高的点对齐(默认为 False)。
- 返回类型:
无
- align_on_border(direction, buff=0.5)[source]¶
方向只需是指向二维平面中边或角的向量。
- 参数:
direction (Vector3D)
buff (浮点数)
- 返回类型:
自身
- align_to(mobject_or_point, direction=array([0., 0., 0.]))[source]¶
在某个方向上将 mobject 与另一个
Mobject
对齐。示例:mob1.align_to(mob2, UP) 垂直移动 mob1,使其顶边与 mob2 的顶边对齐。
- 参数:
mobject_or_point (Mobject | Point3DLike)
direction (Vector3D)
- 返回类型:
自身
- property animate: _AnimationBuilder | Self¶
用于动画化
self
的任何方法的应用。在
animate
上调用的任何方法都会转换为在 mobject 本身应用该方法的动画。例如,
square.set_fill(WHITE)
设置正方形的填充颜色,而square.animate.set_fill(WHITE)
则将此操作动画化。通过链式调用,可以在单个动画中一次性放置多个方法。
self.play(my_mobject.animate.shift(RIGHT).rotate(PI))
警告
不建议在一次调用
play()
时为同一个Mobject
传递多个动画,这很可能无法正常工作。请改为使用方法链式调用,而不是编写如下动画:self.play( my_mobject.animate.shift(RIGHT), my_mobject.animate.rotate(PI) )
make use of method chaining.
可以传递给
Scene.play()
的关键字参数可以直接在访问.animate
后传递,如下所示:self.play(my_mobject.animate(rate_func=linear).shift(RIGHT))
这在为需要不同行为的并行
.animate
调用制作动画时特别有用。self.play( mobject1.animate(run_time=2).rotate(PI), mobject2.animate(rate_func=there_and_back).shift(RIGHT), )
另请参阅
示例
示例:AnimateExample ¶
from manim import * class AnimateExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT)) self.play(s.animate.scale(2)) self.play(s.animate.rotate(PI / 2)) self.play(Uncreate(s))
class AnimateExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT)) self.play(s.animate.scale(2)) self.play(s.animate.rotate(PI / 2)) self.play(Uncreate(s))
示例:AnimateChainExample ¶
from manim import * class AnimateChainExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT).scale(2).rotate(PI / 2)) self.play(Uncreate(s))
class AnimateChainExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT).scale(2).rotate(PI / 2)) self.play(Uncreate(s))
示例:AnimateWithArgsExample ¶
from manim import * class AnimateWithArgsExample(Scene): def construct(self): s = Square() c = Circle() VGroup(s, c).arrange(RIGHT, buff=2) self.add(s, c) self.play( s.animate(run_time=2).rotate(PI / 2), c.animate(rate_func=there_and_back).shift(RIGHT), )
class AnimateWithArgsExample(Scene): def construct(self): s = Square() c = Circle() VGroup(s, c).arrange(RIGHT, buff=2) self.add(s, c) self.play( s.animate(run_time=2).rotate(PI / 2), c.animate(rate_func=there_and_back).shift(RIGHT), )
警告
.animate
将会在
.animate
之前和应用.animate
之后,在Mobject
的点之间进行插值。这在尝试沿路径或旋转进行插值时可能会导致意外行为。如果希望动画考虑中间点,请考虑使用带更新器的ValueTracker
。
- apply_complex_function(function, **kwargs)[source]¶
将复函数应用于
Mobject
。x 和 y Point3D 分别对应于实部和虚部。示例
示例:ApplyFuncExample ¶
from manim import * class ApplyFuncExample(Scene): def construct(self): circ = Circle().scale(1.5) circ_ref = circ.copy() circ.apply_complex_function( lambda x: np.exp(x*1j) ) t = ValueTracker(0) circ.add_updater( lambda x: x.become(circ_ref.copy().apply_complex_function( lambda x: np.exp(x+t.get_value()*1j) )).set_color(BLUE) ) self.add(circ_ref) self.play(TransformFromCopy(circ_ref, circ)) self.play(t.animate.set_value(TAU), run_time=3)
class ApplyFuncExample(Scene): def construct(self): circ = Circle().scale(1.5) circ_ref = circ.copy() circ.apply_complex_function( lambda x: np.exp(x*1j) ) t = ValueTracker(0) circ.add_updater( lambda x: x.become(circ_ref.copy().apply_complex_function( lambda x: np.exp(x+t.get_value()*1j) )).set_color(BLUE) ) self.add(circ_ref) self.play(TransformFromCopy(circ_ref, circ)) self.play(t.animate.set_value(TAU), run_time=3)
- 参数:
function (Callable[[complex], complex])
- 返回类型:
自身
- apply_to_family(func)[source]¶
递归地将函数应用于
self
和每个具有点的子对象。- 参数:
func (Callable[[Mobject], None]) – 应用于每个 mobject 的函数。
func
会将相应的(子)mobject 作为参数传递。- 返回:
self
- 返回类型:
另请参阅
family_members_with_points()
- arrange(direction=array([1., 0., 0.]), buff=0.25, center=True, **kwargs)[source]¶
在屏幕上将
Mobject
彼此相邻排列。示例
示例:Example ¶
from manim import * class Example(Scene): def construct(self): s1 = Square() s2 = Square() s3 = Square() s4 = Square() x = VGroup(s1, s2, s3, s4).set_x(0).arrange(buff=1.0) self.add(x)
class Example(Scene): def construct(self): s1 = Square() s2 = Square() s3 = Square() s4 = Square() x = VGroup(s1, s2, s3, s4).set_x(0).arrange(buff=1.0) self.add(x)
- 参数:
direction (Vector3D)
buff (浮点数)
center (bool)
- 返回类型:
自身
- arrange_in_grid(rows=None, cols=None, buff=0.25, cell_alignment=array([0., 0., 0.]), row_alignments=None, col_alignments=None, row_heights=None, col_widths=None, flow_order='rd', **kwargs)[source]¶
在网格中排列子对象。
- 参数:
rows (int | None) – 网格中的行数。
cols (int | None) – 网格中的列数。
buff (float | tuple[float, float]) – 网格单元格之间的间隙。要指定水平和垂直方向上的不同缓冲区,可以给定一个包含两个值的元组,即
(row, col)
。cell_alignment (Vector3D) – 每个子对象在其网格单元格中的对齐方式。
row_alignments (str | None) – 每行的垂直对齐方式(从上到下)。接受以下字符:
"u"
- 向上,"c"
- 居中,"d"
- 向下。col_alignments (str | None) – 每列的水平对齐方式(从左到右)。接受以下字符:
"l"
- 左对齐,"c"
- 居中,"r"
- 右对齐。row_heights (Iterable[float | None] | None) – 定义某些行的高度列表(从上到下)。如果列表中包含
None
,则相应的行将根据该行中最高的元素自动调整其高度。col_widths (Iterable[float | None] | None) – 定义某些列的宽度列表(从左到右)。如果列表中包含
None
,则相应的列将根据该列中最宽的元素自动调整其宽度。flow_order (str) – 子对象填充网格的顺序。可以是以下值之一:“rd”、“dr”、“ld”、“dl”、“ru”、“ur”、“lu”、“ul”。(“rd” -> 先向右填充,然后向下填充)
- 返回:
self
- 返回类型:
- 抛出:
ValueError – 如果
rows
和cols
太小,无法容纳所有子对象。ValueError – 如果
cols
、col_alignments
和col_widths
,或者rows
、row_alignments
和row_heights
的大小不匹配。
注意
如果仅隐式设置了
cols
和rows
中的一个,则另一个将选择足够大以容纳所有子对象。如果两者都未设置,则它们将选择大致相同,倾向于cols
>rows
(仅仅因为视频通常比其高)。如果同时定义了
cell_alignment
和row_alignments
/col_alignments
,则后者具有更高的优先级。示例
示例:ExampleBoxes ¶
from manim import * class ExampleBoxes(Scene): def construct(self): boxes=VGroup(*[Square() for s in range(0,6)]) boxes.arrange_in_grid(rows=2, buff=0.1) self.add(boxes)
class ExampleBoxes(Scene): def construct(self): boxes=VGroup(*[Square() for s in range(0,6)]) boxes.arrange_in_grid(rows=2, buff=0.1) self.add(boxes)
示例:ArrangeInGrid ¶
from manim import * class ArrangeInGrid(Scene): def construct(self): boxes = VGroup(*[ Rectangle(WHITE, 0.5, 0.5).add(Text(str(i+1)).scale(0.5)) for i in range(24) ]) self.add(boxes) boxes.arrange_in_grid( buff=(0.25,0.5), col_alignments="lccccr", row_alignments="uccd", col_widths=[1, *[None]*4, 1], row_heights=[1, None, None, 1], flow_order="dr" )
class ArrangeInGrid(Scene): def construct(self): boxes = VGroup(*[ Rectangle(WHITE, 0.5, 0.5).add(Text(str(i+1)).scale(0.5)) for i in range(24) ]) self.add(boxes) boxes.arrange_in_grid( buff=(0.25,0.5), col_alignments="lccccr", row_alignments="uccd", col_widths=[1, *[None]*4, 1], row_heights=[1, None, None, 1], flow_order="dr" )
- arrange_submobjects(*args, **kwargs)[source]¶
用小缓冲区排列
submobjects
的位置。示例
示例:ArrangeSumobjectsExample ¶
from manim import * class ArrangeSumobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT*np.random.uniform(-1,1)+UP*np.random.uniform(-1,1)) for i in range(0,15)]) s.shift(UP).set_color(BLUE) s2= s.copy().set_color(RED) s2.arrange_submobjects() s2.shift(DOWN) self.add(s,s2)
class ArrangeSumobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT*np.random.uniform(-1,1)+UP*np.random.uniform(-1,1)) for i in range(0,15)]) s.shift(UP).set_color(BLUE) s2= s.copy().set_color(RED) s2.arrange_submobjects() s2.shift(DOWN) self.add(s,s2)
- 返回类型:
自身
- become(mobject, match_height=False, match_width=False, match_depth=False, match_center=False, stretch=False)[source]¶
编辑点、颜色和子对象,使其与另一个
Mobject
相同注意
如果 match_height 和 match_width 都为
True
,则转换后的Mobject
将首先匹配高度,然后匹配宽度。- 参数:
- 返回类型:
自身
示例
示例:BecomeScene ¶
from manim import * class BecomeScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) circ.become(square) self.wait(0.5)
class BecomeScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) circ.become(square) self.wait(0.5)
以下示例说明了在使用
match_...
和stretch
参数时 mobject 测量值如何变化。我们从一个高 2 单位、宽 4 单位的矩形开始,我们想将其变成一个半径为 3 的圆形。>>> from manim import Rectangle, Circle >>> import numpy as np >>> rect = Rectangle(height=2, width=4) >>> circ = Circle(radius=3)
当
stretch=True
时,目标圆被变形以匹配矩形的比例,导致目标 mobject 成为一个高 2 宽 4 的椭圆。我们可以检查所得点是否满足椭圆方程 \(x^2/a^2 + y^2/b^2 = 1\),其中 \(a = 4/2\) 和 \(b = 2/2\) 是半轴。>>> result = rect.copy().become(circ, stretch=True) >>> result.height, result.width (np.float64(2.0), np.float64(4.0)) >>> ellipse_points = np.array(result.get_anchors()) >>> ellipse_eq = np.sum(ellipse_points**2 * [1/4, 1, 0], axis=1) >>> np.allclose(ellipse_eq, 1) True
当
match_height=True
和match_width=True
时,圆形会按比例缩放,以便分别保留矩形的高度或宽度。所得 mobject 的点满足相应半径 \(r\) 的圆方程 \(x^2 + y^2 = r^2\)。>>> result = rect.copy().become(circ, match_height=True) >>> result.height, result.width (np.float64(2.0), np.float64(2.0)) >>> circle_points = np.array(result.get_anchors()) >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 1) True >>> result = rect.copy().become(circ, match_width=True) >>> result.height, result.width (np.float64(4.0), np.float64(4.0)) >>> circle_points = np.array(result.get_anchors()) >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 2**2) True
当
match_center=True
时,所得 mobject 会被移动,使其中心与原始 mobject 的中心相同。>>> rect = rect.shift(np.array([0, 1, 0])) >>> np.allclose(rect.get_center(), circ.get_center()) False >>> result = rect.copy().become(circ, match_center=True) >>> np.allclose(rect.get_center(), result.get_center()) True
- clear_updaters(recursive=True)[source]¶
移除所有更新器。
- 参数:
recursive (bool) – 是否递归地在所有子对象上调用
clear_updaters
。- 返回:
self
- 返回类型:
- copy()[source]¶
创建并返回
Mobject
的完全相同的副本,包括所有submobjects
。- 返回:
复制品。
- 返回类型:
注意
克隆对象在场景中初始不可见,即使原始对象可见。
- property depth: float¶
mobject 的深度。
- 返回类型:
浮点数
另请参阅
- flip(axis=array([0., 1., 0.]), **kwargs)[source]¶
围绕其中心翻转/镜像 mobject。
示例
示例: FlipExample ¶
from manim import * class FlipExample(Scene): def construct(self): s= Line(LEFT, RIGHT+UP).shift(4*LEFT) self.add(s) s2= s.copy().flip() self.add(s2)
class FlipExample(Scene): def construct(self): s= Line(LEFT, RIGHT+UP).shift(4*LEFT) self.add(s) s2= s.copy().flip() self.add(s2)
- 参数:
axis (Vector3D)
- 返回类型:
自身
- get_color()[source]¶
返回
Mobject
的颜色。示例
>>> from manim import Square, RED >>> Square(color=RED).get_color() == RED True
- 返回类型:
- get_coord(dim, direction=array([0., 0., 0.]))[source]¶
旨在泛化
get_x
、get_y
和get_z
。- 参数:
dim (int)
direction (Vector3D)
- get_critical_point(direction)[source]¶
想象一个边界框包围着
Mobject
。这样的边界框有9个“关键点”:4个角点,4个边中心点,以及中心点。此方法沿着给定方向返回其中一个点。sample = Arc(start_angle=PI / 7, angle=PI / 5) # These are all equivalent max_y_1 = sample.get_top()[1] max_y_2 = sample.get_critical_point(UP)[1] max_y_3 = sample.get_extremum_along_dim(dim=1, key=1)
- get_merged_array(array_attr)[source]¶
返回此 mobject 和所有子对象中给定属性的所有值。
可能包含重复项;顺序是子对象深度优先(先序)遍历的顺序。
- 参数:
array_attr (str)
- 返回类型:
ndarray
- get_midpoint()[source]¶
获取形成
Mobject
路径中点的 Point3D。示例
示例: AngleMidPoint ¶
from manim import * class AngleMidPoint(Scene): def construct(self): line1 = Line(ORIGIN, 2*RIGHT) line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) a = Angle(line1, line2, radius=1.5, other_angle=False) d = Dot(a.get_midpoint()).set_color(RED) self.add(line1, line2, a, d) self.wait()
class AngleMidPoint(Scene): def construct(self): line1 = Line(ORIGIN, 2*RIGHT) line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) a = Angle(line1, line2, radius=1.5, other_angle=False) d = Dot(a.get_midpoint()).set_color(RED) self.add(line1, line2, a, d) self.wait()
- 返回类型:
- get_time_based_updaters()[source]¶
返回所有使用
dt
参数的更新器。更新器使用此参数作为时间差的输入。
- 返回:
基于时间的更新器列表。
- 返回类型:
List[
Callable
]
- get_x(direction=array([0., 0., 0.]))[source]¶
将
Mobject
中心的 x Point3D 作为float
返回。- 参数:
direction (Vector3D)
- 返回类型:
浮点数
- get_y(direction=array([0., 0., 0.]))[source]¶
将
Mobject
中心的 y Point3D 作为float
返回。- 参数:
direction (Vector3D)
- 返回类型:
浮点数
- get_z(direction=array([0., 0., 0.]))[source]¶
将
Mobject
中心的 z Point3D 作为float
返回。- 参数:
direction (Vector3D)
- 返回类型:
浮点数
- has_time_based_updater()[source]¶
测试
self
是否有基于时间的更新器。- 返回:
如果至少有一个更新器使用了 `dt` 参数,则为 `True`,否则为 `False`。
- 返回类型:
bool
- property height: float¶
mobject 的高度。
- 返回类型:
浮点数
示例
示例: HeightExample ¶
from manim import * class HeightExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.height)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(height=5)) self.wait()
class HeightExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.height)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(height=5)) self.wait()
另请参阅
- insert(index, mobject)[source]¶
将 mobject 插入到 self.submobjects 中的特定位置。
实际上只是调用 `self.submobjects.insert(index, mobject)`,其中 `self.submobjects` 是一个列表。
高度改编自 `Mobject.add`。
- 参数:
index (int) – 插入的索引。
mobject (Mobject) – 要插入的 mobject 对象。
- 返回类型:
无
- interpolate(mobject1, mobject2, alpha, path_func=<function interpolate>)[source]¶
将此
Mobject
变为mobject1
和mobject2
之间的插值。示例
示例: DotInterpolation ¶
from manim import * class DotInterpolation(Scene): def construct(self): dotR = Dot(color=DARK_GREY) dotR.shift(2 * RIGHT) dotL = Dot(color=WHITE) dotL.shift(2 * LEFT) dotMiddle = VMobject().interpolate(dotL, dotR, alpha=0.3) self.add(dotL, dotR, dotMiddle)
class DotInterpolation(Scene): def construct(self): dotR = Dot(color=DARK_GREY) dotR.shift(2 * RIGHT) dotL = Dot(color=WHITE) dotL.shift(2 * LEFT) dotMiddle = VMobject().interpolate(dotL, dotR, alpha=0.3) self.add(dotL, dotR, dotMiddle)
- 参数:
mobject1 (Mobject)
mobject2 (Mobject)
alpha (float)
path_func (PathFuncType)
- 返回类型:
自身
- invert(recursive=False)[source]¶
反转
submobjects
列表。- 参数:
recursive (bool) – 如果为 `True`,则此 mobject 族的所有子对象列表都将被反转。
- 返回类型:
无
示例
示例: InvertSumobjectsExample ¶
from manim import * class InvertSumobjectsExample(Scene): def construct(self): s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2 = s.copy() s2.invert() s2.shift(DOWN) self.play(Write(s), Write(s2))
class InvertSumobjectsExample(Scene): def construct(self): s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2 = s.copy() s2.invert() s2.shift(DOWN) self.play(Write(s), Write(s2))
- match_coord(mobject, dim, direction=array([0., 0., 0.]))[source]¶
使 Point3D 与另一个
Mobject
的 Point3D 匹配。
- match_dim_size(mobject, dim, **kwargs)[source]¶
使指定维度与另一个
Mobject
的维度匹配。- 参数:
mobject (Mobject)
dim (int)
- 返回类型:
自身
- match_points(mobject, copy_submobjects=True)[source]¶
编辑点、位置和子对象,使其与另一个
Mobject
相同,同时保持样式不变。示例
示例: MatchPointsScene ¶
from manim import * class MatchPointsScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) self.play(circ.animate.match_points(square)) self.wait(0.5)
class MatchPointsScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) self.play(circ.animate.match_points(square)) self.wait(0.5)
- 参数:
mobject (Mobject)
copy_submobjects (bool)
- 返回类型:
自身
- match_updaters(mobject)[source]¶
匹配给定 mobject 的更新器。
注意
子对象的所有更新器都将被移除,但只会匹配给定 mobject 的更新器,而非其子对象的更新器。
- match_x(mobject, direction=array([0., 0., 0.]))[source]¶
将 x 坐标与另一个
Mobject
的 x 坐标匹配。- 参数:
mobject (Mobject)
- 返回类型:
自身
- match_y(mobject, direction=array([0., 0., 0.]))[source]¶
将 y 坐标与另一个
Mobject
的 x 坐标匹配。- 参数:
mobject (Mobject)
- 返回类型:
自身
- match_z(mobject, direction=array([0., 0., 0.]))[source]¶
将 z 坐标与另一个
Mobject
的 x 坐标匹配。- 参数:
mobject (Mobject)
- 返回类型:
自身
- move_to(point_or_mobject, aligned_edge=array([0., 0., 0.]), coor_mask=array([1, 1, 1]))[source]¶
将
Mobject
的中心移动到特定 Point3D。- 参数:
点或mobject (Point3DLike | Mobject)
对齐的边缘 (Vector3D)
坐标遮罩 (Vector3D)
- 返回类型:
自身
- next_to(mobject_or_point, direction=array([1., 0., 0.]), buff=0.25, aligned_edge=array([0., 0., 0.]), submobject_to_align=None, index_of_submobject_to_align=None, coor_mask=array([1, 1, 1]))[source]¶
将此
Mobject
移至另一个Mobject
或 Point3D 旁边。示例
示例: GeometricShapes ¶
from manim import * class GeometricShapes(Scene): def construct(self): d = Dot() c = Circle() s = Square() t = Triangle() d.next_to(c, RIGHT) s.next_to(c, LEFT) t.next_to(c, DOWN) self.add(d, c, s, t)
class GeometricShapes(Scene): def construct(self): d = Dot() c = Circle() s = Square() t = Triangle() d.next_to(c, RIGHT) s.next_to(c, LEFT) t.next_to(c, DOWN) self.add(d, c, s, t)
- reduce_across_dimension(reduce_func, dim)[source]¶
在此 mobject 和子对象的所有点中,查找某个维度的最小值或最大值。
- 参数:
reduce_func (Callable)
dim (int)
- remove(*mobjects)[source]¶
移除
submobjects
。如果存在,mobjects 将从
submobjects
中移除。mobject 的子类可以实现 `-` 和 `-=` 魔法方法。
另请参阅
- restore()[source]¶
恢复先前使用
save_state()
保存的状态。- 返回类型:
自身
- resume_updating(recursive=True)[source]¶
启用来自更新器和动画的更新。
- 参数:
recursive (bool) – 是否递归地为所有子对象启用更新。
- 返回:
self
- 返回类型:
- rotate(angle, axis=array([0., 0., 1.]), about_point=None, **kwargs)[source]¶
围绕某个点旋转
Mobject
。- 参数:
角度 (float)
axis (Vector3D)
旋转点 (Point3DLike | None)
- 返回类型:
自身
- rotate_about_origin(angle, axis=array([0., 0., 1.]), axes=[])[source]¶
围绕原点([0,0,0])旋转
Mobject
。- 参数:
角度 (float)
axis (Vector3D)
- 返回类型:
自身
- scale(scale_factor, **kwargs)[source]¶
按比例因子缩放大小。
默认行为是围绕 mobject 的中心进行缩放。
- 参数:
缩放因子 (float) – 缩放因子 \(\alpha\)。如果 \(0 < |\alpha| < 1\),mobject 将缩小;如果 \(|\alpha| > 1\),它将增大。此外,如果 \(\alpha < 0\),mobject 也会被翻转。
kwargs – 传递给
apply_points_function_about_point()
的其他关键字参数。
- 返回:
self
- 返回类型:
示例
示例: MobjectScaleExample ¶
from manim import * class MobjectScaleExample(Scene): def construct(self): f1 = Text("F") f2 = Text("F").scale(2) f3 = Text("F").scale(0.5) f4 = Text("F").scale(-1) vgroup = VGroup(f1, f2, f3, f4).arrange(6 * RIGHT) self.add(vgroup)
class MobjectScaleExample(Scene): def construct(self): f1 = Text("F") f2 = Text("F").scale(2) f3 = Text("F").scale(0.5) f4 = Text("F").scale(-1) vgroup = VGroup(f1, f2, f3, f4).arrange(6 * RIGHT) self.add(vgroup)
另请参阅
- scale_to_fit_depth(depth, **kwargs)[source]¶
缩放
Mobject
以适应某个深度,同时保持宽度/高度比例。- 参数:
深度 (float)
- 返回类型:
自身
- scale_to_fit_height(height, **kwargs)[source]¶
缩放
Mobject
以适应某个高度,同时保持宽度/深度比例。- 返回:
self
- 返回类型:
- 参数:
高度 (浮点数)
示例
>>> from manim import * >>> sq = Square() >>> sq.width np.float64(2.0) >>> sq.scale_to_fit_height(5) Square >>> sq.height np.float64(5.0) >>> sq.width np.float64(5.0)
- scale_to_fit_width(width, **kwargs)[source]¶
缩放
Mobject
以适应某个宽度,同时保持高度/深度比例。- 返回:
self
- 返回类型:
- 参数:
宽度 (浮点数)
示例
>>> from manim import * >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.scale_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(5.0)
- set(**kwargs)[source]¶
设置属性。
即 `my_mobject.set(foo=1)` 会应用 `my_mobject.foo = 1`。
这是一个方便的功能,可与
animate
一起使用,以动画方式设置属性。除了此方法之外,还有一个兼容层,允许 `get_*` 和 `set_*` 方法获取和设置通用属性。例如
>>> mob = Mobject() >>> mob.set_foo(0) Mobject >>> mob.get_foo() 0 >>> mob.foo 0
此兼容层不会干扰任何显式定义的 `get_*` 或 `set_*` 方法。
警告
此兼容层是为了向后兼容,并且不保证会一直存在。在适用的情况下,请优先正常获取/设置属性或使用
set()
方法。- 参数:
**kwargs – 要设置的属性及其相应的值。
- 返回:
self
- 返回类型:
示例
>>> mob = Mobject() >>> mob.set(foo=0) Mobject >>> mob.foo 0
- set_color(color=ManimColor('#FFFF00'), family=True)[source]¶
条件是一个函数,它接受一个参数 (x, y, z)。这里它只是递归地作用于子对象,但在子类中,这应该根据颜色的内部工作原理进一步实现。
- 参数:
颜色 (ParsableManimColor)
家族 (bool)
- 返回类型:
自身
- set_color_by_gradient(*colors)[source]¶
- 参数:
颜色 (ParsableManimColor) – 用于渐变的颜色。用法例如 `set_color_by_gradient(RED, BLUE, GREEN)`。
ManimColor.parse(color) (self.color =)
self (return)
- 返回类型:
自身
- classmethod set_default(**kwargs)¶
设置关键字参数的默认值。
如果调用此方法时未附带任何额外关键字参数,则此类的初始化方法的原始默认值将被恢复。
- 参数:
kwargs – 传递任何关键字参数都将更新此类的初始化函数的关键字参数的默认值。
- 返回类型:
无
示例
>>> from manim import Square, GREEN >>> Square.set_default(color=GREEN, fill_opacity=0.25) >>> s = Square(); s.color, s.fill_opacity (ManimColor('#83C167'), 0.25) >>> Square.set_default() >>> s = Square(); s.color, s.fill_opacity (ManimColor('#FFFFFF'), 0.0)
示例: ChangedDefaultTextcolor ¶
from manim import * config.background_color = WHITE class ChangedDefaultTextcolor(Scene): def construct(self): Text.set_default(color=BLACK) self.add(Text("Changing default values is easy!")) # we revert the colour back to the default to prevent a bug in the docs. Text.set_default(color=WHITE)
config.background_color = WHITE class ChangedDefaultTextcolor(Scene): def construct(self): Text.set_default(color=BLACK) self.add(Text("Changing default values is easy!")) # we revert the colour back to the default to prevent a bug in the docs. Text.set_default(color=WHITE)
- set_x(x, direction=array([0., 0., 0.]))[source]¶
设置
Mobject
中心的 x 值(int
或float
)。- 参数:
x (float)
direction (Vector3D)
- 返回类型:
自身
- set_y(y, direction=array([0., 0., 0.]))[source]¶
设置
Mobject
中心的 y 值(int
或float
)。- 参数:
y (float)
direction (Vector3D)
- 返回类型:
自身
- set_z(z, direction=array([0., 0., 0.]))[source]¶
设置
Mobject
中心的 z 值(int
或float
)。- 参数:
z (float)
direction (Vector3D)
- 返回类型:
自身
- set_z_index(z_index_value, family=True)[source]¶
将
Mobject
的 `z_index` 设置为 `z_index_value` 中指定的值。- 参数:
z_index_value (float) – 设置的 `z_index` 新值。
family (bool) – 如果为 `True`,则所有子对象的 `z_index` 值也将被设置。
- 返回:
`z_index` 设置后的 Mobject 对象本身。用于链式调用。(返回 `self`。)
- 返回类型:
示例
示例: SetZIndex ¶
from manim import * class SetZIndex(Scene): def construct(self): text = Text('z_index = 3', color = PURE_RED).shift(UP).set_z_index(3) square = Square(2, fill_opacity=1).set_z_index(2) tex = Tex(r'zIndex = 1', color = PURE_BLUE).shift(DOWN).set_z_index(1) circle = Circle(radius = 1.7, color = GREEN, fill_opacity = 1) # z_index = 0 # Displaying order is now defined by z_index values self.add(text) self.add(square) self.add(tex) self.add(circle)
class SetZIndex(Scene): def construct(self): text = Text('z_index = 3', color = PURE_RED).shift(UP).set_z_index(3) square = Square(2, fill_opacity=1).set_z_index(2) tex = Tex(r'zIndex = 1', color = PURE_BLUE).shift(DOWN).set_z_index(1) circle = Circle(radius = 1.7, color = GREEN, fill_opacity = 1) # z_index = 0 # Displaying order is now defined by z_index values self.add(text) self.add(square) self.add(tex) self.add(circle)
- set_z_index_by_z_Point3D()[source]¶
将
Mobject
的 z Point3D 设置为 `z_index` 的值。- 返回:
`z_index` 设置后的 Mobject 对象本身。(返回 `self`。)
- 返回类型:
- shuffle(recursive=False)[source]¶
打乱
submobjects
列表。- 参数:
recursive (bool)
- 返回类型:
无
- shuffle_submobjects(*args, **kwargs)[source]¶
打乱
submobjects
的顺序。示例
示例: ShuffleSubmobjectsExample ¶
from manim import * class ShuffleSubmobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2= s.copy() s2.shuffle_submobjects() s2.shift(DOWN) self.play(Write(s), Write(s2))
class ShuffleSubmobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2= s.copy() s2.shuffle_submobjects() s2.shift(DOWN) self.play(Write(s), Write(s2))
- 返回类型:
无
- sort(point_to_num_func=<function Mobject.<lambda>>, submob_func=None)[source]¶
根据
submob_func
定义的函数对submobjects
列表进行排序。- 参数:
point_to_num_func (Callable[[Point3DLike], float])
submob_func (Callable[[Mobject], Any] | None)
- 返回类型:
自身
- sort_submobjects(*args, **kwargs)[source]¶
排序
submobjects
。- 返回类型:
自身
- stretch_to_fit_depth(depth, **kwargs)[source]¶
拉伸
Mobject
以适应某个深度,不保持宽度/高度比例。- 参数:
深度 (float)
- 返回类型:
自身
- stretch_to_fit_height(height, **kwargs)[source]¶
拉伸
Mobject
以适应某个高度,不保持宽度/深度比例。- 返回:
self
- 返回类型:
- 参数:
高度 (浮点数)
示例
>>> from manim import * >>> sq = Square() >>> sq.width np.float64(2.0) >>> sq.stretch_to_fit_height(5) Square >>> sq.height np.float64(5.0) >>> sq.width np.float64(2.0)
- stretch_to_fit_width(width, **kwargs)[source]¶
拉伸
Mobject
以适应某个宽度,不保持高度/深度比例。- 返回:
self
- 返回类型:
- 参数:
宽度 (浮点数)
示例
>>> from manim import * >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.stretch_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(2.0)
- suspend_updating(recursive=True)[source]¶
禁用来自更新器和动画的更新。
- 参数:
recursive (bool) – 是否递归地暂停所有子对象的更新。
- 返回:
self
- 返回类型:
- to_corner(corner=array([-1., -1., 0.]), buff=0.5)[source]¶
将此
Mobject
移动到屏幕的给定角点。示例
示例: ToCornerExample ¶
from manim import * class ToCornerExample(Scene): def construct(self): c = Circle() c.to_corner(UR) t = Tex("To the corner!") t2 = MathTex("x^3").shift(DOWN) self.add(c,t,t2) t.to_corner(DL, buff=0) t2.to_corner(UL, buff=1.5)
class ToCornerExample(Scene): def construct(self): c = Circle() c.to_corner(UR) t = Tex("To the corner!") t2 = MathTex("x^3").shift(DOWN) self.add(c,t,t2) t.to_corner(DL, buff=0) t2.to_corner(UL, buff=1.5)
- to_edge(edge=array([-1., 0., 0.]), buff=0.5)[source]¶
将此
Mobject
移动到屏幕的给定边缘,而不影响其在其他维度上的位置。示例
示例: ToEdgeExample ¶
from manim import * class ToEdgeExample(Scene): def construct(self): tex_top = Tex("I am at the top!") tex_top.to_edge(UP) tex_side = Tex("I am moving to the side!") c = Circle().shift(2*DOWN) self.add(tex_top, tex_side, c) tex_side.to_edge(LEFT) c.to_edge(RIGHT, buff=0)
class ToEdgeExample(Scene): def construct(self): tex_top = Tex("I am at the top!") tex_top.to_edge(UP) tex_side = Tex("I am moving to the side!") c = Circle().shift(2*DOWN) self.add(tex_top, tex_side, c) tex_side.to_edge(LEFT) c.to_edge(RIGHT, buff=0)
- update(dt=0, recursive=True)[source]¶
应用所有更新器。
如果更新被暂停,则不执行任何操作。
- 参数:
dt (float) – 传递给更新函数的参数 `dt`。通常,这是自上次调用 `update` 以来经过的秒数。
recursive (bool) – 是否递归地更新所有子对象。
- 返回:
self
- 返回类型:
另请参阅
- property width: float¶
mobject 的宽度。
- 返回类型:
浮点数
示例
示例: WidthExample ¶
from manim import * class WidthExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.width)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(width=7)) self.wait()
class WidthExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.width)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(width=7)) self.wait()
另请参阅