移动与变形¶
影片代码
import manimgx as m
import numpy as np
class MoveAndDeformHero(m.Scene):
def construct(self) -> None:
grid = m.NumberPlane(
x_range=[-4, 4, 1], y_range=[-3, 3, 1]
).prepare_for_nonlinear_transform()
self.add(grid)
self.play(m.ApplyMatrix([[1, 1], [0, 1]], grid), run_time=2)
self.play(
m.ApplyFunction(
lambda mob: mob.apply_function(
lambda p: p + 0.3 * np.array([np.sin(p[1]), np.sin(p[0]), 0])
),
grid,
),
run_time=2,
)
self.wait()
某些变化不是方法调用:绕某点旋转且 mobject 持续转动、沿路径行进、每个点的变形。这些 动画实现它们。
旋转与跟随¶
Rotate
¶
代码
import manimgx as m
class RotateExample(m.Scene):
def construct(self) -> None:
pivot = m.Dot(radius=0.1)
left = m.Rectangle(m.BLUE, width=2.5, height=1.2, fill_opacity=0.5)
right = left.copy().set_color(m.YELLOW)
left.shift(4 * m.LEFT)
right.shift(2 * m.RIGHT)
self.add(pivot, left, right)
self.play(
m.Rotate(left, m.PI / 2),
m.Rotate(right, m.PI / 2, about_point=pivot.get_center()),
run_time=2,
)
将一个 mobject 绕某点刚性旋转。
它绕 axis 轴转过 angle 角度,围绕一个枢轴:about_point,或其边界框上
about_edge 方向的点,或其中心,该枢轴取自旋转开始时 mobject 的状态。
每个点沿绕枢轴的圆周移动,因此 mobject 在途中保持其形状,
而 TAU 的角度为一整圈。
mobject要旋转的 mobject。
angle旋转角度,以弧度为单位,绕
axis逆时针方向。axis旋转所绕的轴;默认为
OUT,即在屏幕平面内旋转。about_point枢轴;None 表示取自
about_edge或中心。about_edge未给定
about_point时,所绕的边界框上点的方向。run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
Rotating
¶
以匀速旋转一个 mobject:默认为 5 秒内转一整圈。
即一个角度为 TAU(除非另行指定)的 Rotate,
以匀速(linear)进行,历时 5 秒。
mobject要旋转的 mobject。
angle旋转角度,以弧度为单位,绕
axis逆时针方向。axis旋转所绕的轴;默认为
OUT,即在屏幕平面内旋转。about_point枢轴;None 表示取自
about_edge或中心。about_edge未给定
about_point时,所绕的边界框上点的方向。run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
MoveAlongPath
¶
沿一条路径移动一个 mobject。
其中心沿 path 从路径起点移动到终点,沿其长度以匀速行进
(由速率函数缓动),该 mobject 保持其形状。它从路径起点开始,
无论其原先位于何处。其自身的更新器在移动期间直接作用于它
(suspend_mobject_updating 为 False)。
mobject要移动的 mobject。
path它所沿行的曲线。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
经过函数¶
mobject 的每个点前往函数将其映射到的位置。弯曲的映像需要更多点:先插入曲线 (参见 insert_n_curves)。
ApplyFunction
¶
代码
import manimgx as m
class ApplyFunctionExample(m.Scene):
def construct(self) -> None:
square = m.Square(side_length=3, color=m.BLUE, fill_opacity=0.5)
self.add(square)
def to_red_circle(mob: m.Mobject) -> m.Mobject:
circle = m.Circle(radius=2, color=m.RED, fill_opacity=0.5)
return circle.move_to(mob)
self.play(m.ApplyFunction(to_red_circle, square))
将一个 mobject 变换为一个函数对其作用后的结果。
该函数在动画开始时收到该 mobject 的副本,并返回要变换到的状态: 即该副本经修改后的结果,或一个新的 mobject(其他返回值会引发 TypeError)。
function从该 mobject 的副本到其终止状态的函数。
mobject要变换的 mobject。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
ApplyPointwiseFunction
¶
代码
将一个 mobject 变换为在一个点的函数下的像。
每个点 p 沿直线移动到 function(p),路径的曲线按
apply_function 的方式映射,
在函数使其弯曲处被切分为更多曲线。运行 3 秒。
function从一个点到其去向的函数,以场景坐标表示。
mobject要移动的 mobject。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
ApplyMatrix
¶
以矩阵变换一个 mobject:每个点 p 变为 M·p。
2 × 2 矩阵作用于 x 和 y,保持 z 不变;3 × 3 矩阵作用于全部三个坐标 (其他形状会引发 ValueError)。各点沿直线移动。运行 3 秒。
m.ApplyMatrix(matrix, mobject, about_point=ORIGIN, **kwargs)
matrix矩阵,2 × 2 或 3 × 3,以嵌套列表或数组表示。
mobject要变换的 mobject。
about_point保持不动的点。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
ApplyComplexFunction
¶
将一个 mobject 变换为在一个复数函数下的像。
每个点 (x, y, z) 被视为 x + iy,沿直线移动到其在该函数下的像, 保持 z 不变,路径的曲线按 apply_function 的方式映射。
function从复数到复数的函数。
mobjectThe mobject to move.
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 变换关键字。
源码
manimgx\animation\motion.py
随时间变形¶
Homotopy
¶
代码
import numpy as np
import manimgx as m
class HomotopyExample(m.Scene):
def construct(self) -> None:
line = m.FunctionGraph(lambda x: 0, x_range=(-6, 6), color=m.BLUE)
def wave(x: float, y: float, z: float, t: float) -> tuple[float, ...]:
return (x, y + 1.5 * t * np.sin(2 * x - 6 * t), z)
self.add(line)
self.play(m.Homotopy(wave, line))
以同伦变形一个 mobject:一个关于每个点与进度的函数。
在进度 t(从 0 到 1,由速率函数缓动)处,该 mobject 为其初始状态的像:
每个点 (x, y, z) 变为 homotopy(x, y, z, t),路径的曲线按
apply_function 的方式映射。运行 3 秒。
homotopy关于 x、y、z 和 t 的函数,返回该点在 t 处的位置。
mobject要变形的 mobject。
apply_function_kwargs坐标度量的基准位置:
{"about_point": ...}或{"about_edge": ...};None 表示以原点为基准。run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 动画关键字。
源码
manimgx\animation\motion.py
ComplexHomotopy
¶
代码
import numpy as np
import manimgx as m
class ComplexHomotopyExample(m.Scene):
def construct(self) -> None:
plane = m.NumberPlane(x_range=(-3, 3), y_range=(-3, 3))
plane.prepare_for_nonlinear_transform()
self.add(plane)
self.play(
m.ComplexHomotopy(lambda z, t: z * np.exp(0.5j * t * abs(z)), plane)
)
以复同伦变形一个 mobject:一个关于 x + iy 与进度的函数。
在进度 t(从 0 到 1,由速率函数缓动)处,该 mobject 为其初始状态的像:
每个点 (x, y, z) 变为 complex_homotopy(x + iy, t),保持 z 不变,
路径的曲线按 apply_function 的方式映射。
运行 3 秒。
complex_homotopy关于 z 和 t 的函数,返回该点在 t 处的位置,以复数表示。
mobject要变形的 mobject。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 动画关键字。
源码
manimgx\animation\motion.py
ApplyWave
¶
让一个波从左到右穿过一个 mobject。
当波经过时,其各点沿 direction 方向位移,至多为 amplitude,
波过后各点回到原位。运行 2 秒。
mobject要起波的 mobject。
direction各点位移的方向。
amplitude各点至多位移的距离,以场景单位表示。
wave_func每个波纹升起的形状:一个速率函数。
time_width波的宽度,以该 mobject 宽度的分数表示。
ripples波所含的波纹数。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 动画关键字。
源码
manimgx\animation\motion.py
PhaseFlow
¶
代码
import numpy as np
import manimgx as m
class PhaseFlowExample(m.Scene):
def construct(self) -> None:
square = m.Square(side_length=2, color=m.BLUE, fill_opacity=0.5)
square.shift(3 * m.RIGHT)
self.add(m.Dot(), square)
def spiral(p: np.ndarray) -> np.ndarray:
return np.array([-p[1] - 0.3 * p[0], p[0] - 0.3 * p[1], 0.0])
self.play(m.PhaseFlow(spiral, square, virtual_time=m.PI, run_time=3))
将一个 mobject 的各点沿一个向量场携带。
每个点以 function 在其所在位置给出的速度移动,在动画期间流过
virtual_time 个场的时间单位,从动画开始时其所在位置出发。
该流以场的时间为步长积分,每秒动画 config.simulation_rate 步,
采用经典 Runge–Kutta 方法,因此在任何帧率下结果相同;
步与步之间的帧显示从前一步继续的流。路径的曲线按
apply_function 的方式映射。
动画以匀速进行(linear),且该 mobject 自身的更新器直接作用于它
(suspend_mobject_updating 为 False)。
function向量场:从一个点到其速度的函数。
mobject要携带的 mobject。
virtual_time各点流动的时长,以场的时间单位表示。
run_time动画播放时长,以秒为单位(默认 1)。
lag_ratiomobject 各部分如何交错:每个部分在其前一个部分开始后,经过其运行时长的该分数比例后开始 (默认 0:全部同时;1:一个接一个)。
rate_func动画进度如何随时间运行:一个从 [0, 1] 到 [0, 1] 的函数 (默认为
smooth;参见 rate functions)。reverse_rate_function是否反向运行动画(默认 False)。
name动画的名称。
remover动画结束时 mobject 是否离开场景 (默认 False)。
suspend_mobject_updating动画期间 mobject 的更新器是否在其下运行(默认 True):它们 持续作用于 mobject,每一帧显示动画应用于其结果。 若为 False,则它们作用于被动画的 mobject 本身。
introducer动画开始时 mobject 是否加入场景(默认 False); 否则若场景缺少它,play 在其开始时将其带入。
use_override若某 mobject 的类用另一个动画代替此动画播放,是否如此执行 (默认 True)。
还接受 动画关键字。
源码
manimgx\animation\motion.py