场景¶
合格名称: manim.scene.scene.Scene
- 类 Scene(renderer=None, camera_class=<class 'manim.camera.camera.Camera'>, always_update_mobjects=False, random_seed=None, skip_animations=False)[source]¶
基类:
object
场景是您的动画的画布。
Scene
的主要作用是为用户提供管理 mobject 和动画的工具。一般来说,Manim 脚本由一个从Scene
派生的类组成,其Scene.construct()
方法由用户代码重写。通过调用
Scene.add()
在屏幕上显示 Mobject,并通过调用Scene.remove()
将其从屏幕上移除。所有当前在屏幕上的 Mobject 都保存在Scene.mobjects
中。通过调用Scene.play()
播放动画。通过调用
Scene
内部的Scene.render()
方法来渲染场景。这会依次调用Scene.setup()
、Scene.construct()
和Scene.tear_down()
。不建议在用户场景中重写
__init__
方法。对于应在场景渲染之前运行的代码,请改用Scene.setup()
。示例
用您的代码重写
Scene.construct()
方法。class MyScene(Scene): def construct(self): self.play(Write(Text("Hello World!")))
方法
Mobject 将按照添加的顺序从背景到前景显示。
将单个 mobject 添加到前景,并内部添加到 foreground_mobjects 和 mobjects 列表中。
将 mobject 添加到前景,并内部添加到 foreground_mobjects 和 mobjects 列表中。
add_mobjects_from_animations
此方法用于为动画添加声音。
在当前时间戳的相应副标题文件中添加一个条目。
向场景添加更新函数。
开始场景的动画。
将 mobject 从场景中移除并将其添加到场景的后方。
将传入的 mobject 再次添加到场景中,将其推到场景的前方。
check_interactive_embed_is_valid
从场景中移除 self.mobjects 和 self.foreground_mobjects 中存在的所有 mobject。
给定动画列表,编译相应的静态和移动 mobject,并收集动画时长。
从任何 _AnimationBuilders 创建 _MethodAnimations,并使用传递给 play() 的 kwargs 更新动画 kwargs。
向场景添加内容。
embed
根据属性的标识符/名称获取场景的属性。
返回场景中所有 mobject 的家族成员列表。
get_moving_and_static_mobjects
获取传入动画中的所有移动 mobject。
给定 mobject 列表和要移除的 mobject 列表,此方法从 mobject 列表中过滤掉可移除的 mobject。
获取动画列表的总运行时间。
在制作自己的动画时,您很少会用到这个。
返回所有非子对象的 mobject。
interact
类似于 embed(),但允许屏幕交互。
返回当前动画是否生成静态帧(通常是 Wait)。
mouse_drag_orbit_controls
mouse_scroll_orbit_controls
在此处创建分隔;上一节结束,新一节创建。
on_key_press
on_key_release
on_mouse_drag
on_mouse_motion
on_mouse_press
on_mouse_scroll
暂停场景(即显示冻结帧)。
在此场景中播放动画。
此方法用于准备动画以进行渲染,向其应用所需的参数,渲染它们,并将其写入视频文件。
通过从“mobjects”和“foreground_mobjects”中移除 mobject,从而将传入列表中的 mobject 从场景和前景中移除。
从前景中移除单个 mobject,并内部从 foreground_mobjects 列表中移除。
从前景中移除 mobject,并内部从 foreground_mobjects 列表中移除。
从场景中移除更新函数。
渲染此场景。
在场景中用一个 mobject 替换另一个,同时保留绘制顺序。
tl:wr
set_key_function
这应由任何常用作子类并需要在使用 construct 方法之前进行一些通用设置的场景实现。
如果应更新此场景的 mobject,则返回 True。
这应由任何常用作子类并需要在场景结束前调用一些通用方法的场景实现。
update_meshes
开始更新场景中的所有 mobject。
运行所有场景更新函数。
update_to_time
validate_run_time
播放一个“无操作”动画。
等待直到满足条件,最多持续给定最大时长。
属性
相机
场景开始以来的时间。
- 参数:
renderer (CairoRenderer | OpenGLRenderer | None)
camera_class (type[Camera])
always_update_mobjects (bool)
random_seed (int | None)
skip_animations (bool)
- _get_animation_time_progression(animations, duration)[source]¶
在制作自己的动画时,您很少会用到这个。此方法供 Manim 内部使用。
使用
get_time_progression()
获取一个命令行进度条(CommandLine ProgressBar),其fill_time
取决于传入动画的特性,- 参数:
animations (list[Animation]) – 获取时间进程的动画列表。
duration (float) – 等待时间的时长
- 返回:
命令行进度条。
- 返回类型:
time_progression
- add_foreground_mobject(mobject)[source]¶
将单个 mobject 添加到前景,并内部添加到 foreground_mobjects 和 mobjects 列表中。
- add_foreground_mobjects(*mobjects)[source]¶
将 mobject 添加到前景,并内部添加到 foreground_mobjects 和 mobjects 列表中。
- add_sound(sound_file, time_offset=0, gain=None, **kwargs)[source]¶
此方法用于为动画添加声音。
- 参数:
sound_file (str) – 音频文件的路径。
time_offset (float) – 音频文件中的偏移量,在此偏移量之后可以播放声音。
gain (float | None) – 声音的增益。
示例
示例: SoundExample ¶
from manim import * class SoundExample(Scene): # Source of sound under Creative Commons 0 License. https://freesound.org/people/Druminfected/sounds/250551/ def construct(self): dot = Dot().set_color(GREEN) self.add_sound("click.wav") self.add(dot) self.wait() self.add_sound("click.wav") dot.set_color(BLUE) self.wait() self.add_sound("click.wav") dot.set_color(RED) self.wait()
class SoundExample(Scene): # Source of sound under Creative Commons 0 License. https://freesound.org/people/Druminfected/sounds/250551/ def construct(self): dot = Dot().set_color(GREEN) self.add_sound("click.wav") self.add(dot) self.wait() self.add_sound("click.wav") dot.set_color(BLUE) self.wait() self.add_sound("click.wav") dot.set_color(RED) self.wait()
在此处下载上一个示例的资源 here。
- add_subcaption(content, duration=1, offset=0)[source]¶
在当前时间戳的相应副标题文件中添加一个条目。
当前时间戳从
Scene.time
获取。- 参数:
content (str) – 副标题内容。
duration (float) – 副标题显示的时长(秒)。
offset (float) – 此偏移量(秒)将添加到副标题的起始时间戳。
- 返回类型:
无
示例
此示例说明了向 Manim 动画添加副标题的两种可能性
class SubcaptionExample(Scene): def construct(self): square = Square() circle = Circle() # first option: via the add_subcaption method self.add_subcaption("Hello square!", duration=1) self.play(Create(square)) # second option: within the call to Scene.play self.play( Transform(square, circle), subcaption="The square transforms." )
- add_updater(func)[source]¶
向场景添加更新函数。
场景更新函数每帧运行,它们是最后一种运行的更新器。
警告
当使用 Cairo 渲染器时,修改 mobject 的场景更新器不会像 mobject 更新器那样被检测到。具体来说,仅通过场景更新器修改的 mobject 不一定会添加到移动 mobject 列表中,因此可能不会每帧更新。
一言以蔽之:使用 mobject 更新器来更新 mobject。
- 参数:
func (Callable[[float], None]) – 更新函数。它接受一个浮点数,表示自上次更新以来的时间差(通常等于帧率)。
- 返回类型:
无
- clear()[source]¶
从场景中移除 self.mobjects 和 self.foreground_mobjects 中存在的所有 mobject。
- 返回:
已移除 self.mobjects 和 self.foreground_mobjects 中所有 mobject 的场景。
- 返回类型:
- compile_animation_data(*animations, **play_kwargs)[source]¶
给定动画列表,编译相应的静态和移动 mobject,并收集动画时长。
这也启动了动画。
- compile_animations(*args, **kwargs)[source]¶
从任何 _AnimationBuilders 创建 _MethodAnimations,并使用传递给 play() 的 kwargs 更新动画 kwargs。
- construct()[source]¶
向场景添加内容。
在
Scene.construct()
内部,通过调用Scene.add()
在屏幕上显示 Mobject,并通过调用Scene.remove()
将其从屏幕上移除。所有当前在屏幕上的 Mobject 都保存在Scene.mobjects
中。通过调用Scene.play()
播放动画。注意
初始化代码应放入
Scene.setup()
中。终止代码应放入Scene.tear_down()
中。示例
一个典型的 Manim 脚本包括一个从
Scene
派生并重写了Scene.construct()
方法的类class MyScene(Scene): def construct(self): self.play(Write(Text("Hello World!")))
- get_attrs(*keys)[source]¶
根据属性的标识符/名称获取场景的属性。
- 参数:
*keys (str) – 要返回属性的参数名称。
- 返回:
传入标识符的属性列表。
- 返回类型:
list
- get_mobject_family_members()[source]¶
返回场景中所有 mobject 的家族成员列表。如果添加了 Circle() 和 VGroup(Rectangle(),Triangle()),它不仅返回 Circle()、Rectangle() 和 Triangle(),还返回 VGroup() 对象。
- 返回:
mobject 家族成员列表。
- 返回类型:
list
- get_moving_mobjects(*animations)[source]¶
获取传入动画中的所有移动 mobject。
- 参数:
*animations (Animation) – 要检查移动 mobject 的动画。
- 返回:
动画中可能移动的 mobject 列表
- 返回类型:
list
- get_restructured_mobject_list(mobjects, to_remove)[source]¶
给定 mobject 列表和要移除的 mobject 列表,此方法从 mobject 列表中过滤掉可移除的 mobject。
- 参数:
mobjects (list) – 要检查的 Mobject。
to_remove (list) – 要移除的 mobject 列表。
- 返回:
已移除要移除的 mobject 的 mobject 列表。
- 返回类型:
list
- get_run_time(animations)[source]¶
获取动画列表的总运行时间。
- 参数:
animations (list[Animation]) – 要计算总
run_time
的动画列表。- 返回:
列表中所有动画的总
run_time
。- 返回类型:
浮点数
- get_time_progression(run_time, description, n_iterations=None, override_skip_animations=False)[source]¶
在制作自己的动画时,您很少会用到这个。此方法供 Manim 内部使用。
返回一个命令行进度条(CommandLine ProgressBar),其
fill_time
取决于动画的run_time
、该动画中要执行的迭代次数以及一个布尔值,指示是否考虑跳过的动画。- 参数:
run_time (float) – 动画的
run_time
。n_iterations (int | None) – 动画中的迭代次数。
override_skip_animations (bool) – 是否在进度条中显示跳过的动画。
- 返回:
命令行进度条。
- 返回类型:
time_progression
- next_section(name='unnamed', section_type=DefaultSectionType.NORMAL, skip_animations=False)[source]¶
在此处创建分隔;上一节结束,新一节创建。
skip_animations
跳过此节中所有动画的渲染。有关如何使用章节的更多信息,请参阅文档。- 参数:
name (str)
section_type (str)
skip_animations (bool)
- 返回类型:
无
- pause(duration=1.0)[source]¶
暂停场景(即显示冻结帧)。
这是
wait()
的别名,其中frozen_frame
设置为True
。- 参数:
duration (float) – 暂停的时长。
- play(*args, subcaption=None, subcaption_duration=None, subcaption_offset=0, **kwargs)[source]¶
在此场景中播放动画。
- play_internal(skip_rendering=False)[source]¶
此方法用于准备动画以进行渲染,向其应用所需的参数,渲染它们,并将其写入视频文件。
- 参数:
skip_rendering (bool) – 是否跳过渲染,默认为 False
- remove(*mobjects)[source]¶
通过从“mobjects”和“foreground_mobjects”中移除 mobject,从而将传入列表中的 mobject 从场景和前景中移除
- 参数:
*mobjects (Mobject) – 要移除的 mobject。
- replace(old_mobject, new_mobject)[source]¶
在场景中用一个 mobject 替换另一个,同时保留绘制顺序。
如果
old_mobject
是某个其他 Mobject(例如Group
)的子对象,则 new_mobject 将在组内替换它,而不会更改父 mobject。
- restructure_mobjects(to_remove, mobject_list_name='mobjects', extract_families=True)[source]¶
- tl:wr
如果您的场景有一个 Group(),并且您从 Group 中移除了一个 mobject,此方法将解散该组并将其余 mobject 直接放入 self.mobjects 或 self.foreground_mobjects 中。
在场景包含组(例如 Group(m1, m2, m3))但其子对象之一被移除(例如 scene.remove(m1))的情况下,mobject 列表将被编辑为包含其他子对象,但不包含 m1,例如,它现在将 m2 和 m3 插入到该组曾经存在的位置。
- should_update_mobjects()[source]¶
如果应更新此场景的 mobject,则返回 True。
特别是,这会检查是否
这只在播放单个 Wait 动画时调用。
- 返回类型:
布尔值
- 属性 time: float¶
场景开始以来的时间。
- update_mobjects(dt)[source]¶
开始更新场景中的所有 mobject。
- 参数:
dt (float) – 更新之间的时间变化。默认值(通常)为 1/frames_per_second
- update_self(dt)[source]¶
运行所有场景更新函数。
在所有类型的更新函数(mobject 更新器、网格更新器、场景更新器)中,场景更新函数最后调用。
- 参数:
dt (float) – 自上次更新以来的场景时间。
- wait(duration=1.0, stop_condition=None, frozen_frame=None)[source]¶
播放一个“无操作”动画。
- 参数:
duration (float) – 动画的运行时间。
stop_condition (Callable[[], bool] | None) – 一个不带位置参数的函数,每次渲染帧时都会对其进行评估。只有当函数的返回值是真值,或者当
duration
中指定的时间过去时,动画才会停止。frozen_frame (bool | None) – 如果为 True,则不评估更新函数,动画输出冻结帧。如果为 False,则调用更新函数并照常渲染帧。如果为 None(默认),场景会尝试自行判断帧是否冻结。
另请参阅
Wait
,should_mobjects_update()