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()另请参阅