本篇介绍Manim
中两个和动画轨迹相关的类,AnimatedBoundary
和TracedPath
。
AnimatedBoundary
聚焦于图形边界的动态呈现,能精准控制边界绘制的每一帧,助力我们清晰展示几何图形的搭建流程。
TracedPath
则擅长实时追踪物体或点的运动轨迹,以直观且动态的方式呈现各类运动路径,为我们分析和展示复杂运动提供了强大支持 。
1. 动画概述
1.1. AnimatedBoundary
在讲解几何图形(如多边形、圆形等)的构造过程时,AnimatedBoundary
可以逐帧展示图形边界的绘制,帮助我们理解图形是如何一步步形成的。
此外,当图形的边界随着某个参数或条件动态变化时,使用 AnimatedBoundary
也可以生动地呈现这种变化。
AnimatedBoundary
动画的主要特点在于图形边界的绘制,它能够精确控制边界的出现顺序和方式。
这使得在展示几何图形的构建过程时,能够突出边界这一关键元素,更清楚地展示图形的轮廓是如何形成的。
它的参数主要有:
参数名称 | 类型 | 说明 |
---|---|---|
vmobject | VMobject | 要应用动画边界的 VMobject |
colors | [Color] | 颜色列表,用于指定边界颜色变化的序列 |
max_stroke_width | int | 最大描边宽度 |
cycle_rate | float | 颜色循环速率 |
back_and_forth | bool | 是否来回循环颜色变化 |
draw_rate_func | func | 用于控制绘制速率的函数 |
fade_rate_func | func | 用于控制淡出速率的函数 |
1.2. TracedPath
在物理学或数学中,当需要展示物体的运动轨迹时,TracedPath
是一个非常合适的工具。
例如,展示抛体运动、圆周运动等物体的运动路径时,能让我们直观地看到物体在空间中的运动轨迹。
此外,对于函数图像的绘制,也可使用 TracedPath
来模拟绘图过程,展示函数曲线是如何随着自变量的变化而逐步生成的。
这在演示函数的性质和图像绘制方法时非常有用,能够帮助学生更好地理解函数的变化规律。
TracedPath
动画的主要特点是能够实时跟踪物体或点的运动轨迹,并将其以动画的形式呈现出来。
这种实时跟踪的特性使得动画更加真实、生动,能够准确地反映物体的运动状态。
它的参数主要有:
参数名称 | 类型 | 说明 |
---|---|---|
traced_point_func | func | 要跟踪的函数,该函数应返回一个点的坐标 |
stroke_width | float | 轨迹的线条宽度 |
stroke_color | Color | 轨迹的颜色 |
dissipating_time | float | 路径消散所需的时间 |
当dissipating_time
参数为None
时,表示路径轨迹不消散。
TracedPath
还有一个方法:
名称 | 说明 |
---|---|
update_path | 用于更新轨迹路径的方法,通常在动画过程中被调用,以实时跟踪点的移动并更新轨迹 |
2. 使用示例
下面通过几个根据实际应用场景简化而来的示例来演示两个动画类的使用。
2.1. 多边形绘制
这个示例中,首先创建了一个矩形多边形,然后使用 AnimatedBoundary
为其添加边界动画,
颜色在蓝色、绿色、黄色之间循环变化,循环速率为 3
,突出展示多边形边界的绘制动画。
polygon = Polygon( [-2, -1, 0], [2, -1, 0], [2, 1, 0], [-2, 1, 0], ) boundary = AnimatedBoundary( polygon, colors=[BLUE, GREEN, YELLOW], cycle_rate=3, ) self.add(polygon, boundary)
2.2. 动态更新圆形边界
先创建了一个圆形,其边界的颜色在红色,黄色和绿色之间循环,循环速率为 2。
然后通过动画将圆形的半径放大 2
倍,展示了圆形边界在动态变化过程中的动画效果。
circle = Circle(radius=1) boundary = AnimatedBoundary( circle, colors=[RED, YELLOW, GREEN], cycle_rate=2, ) self.add(circle, boundary) self.play(circle.animate.scale(2), run_time=3)
2.3. 跟踪抛体运动轨迹
首先定义一个抛体运动的函数 move_path
,再创建了一个点 Dot
和一个 TracedPath
对象来跟踪点的运动轨迹。
轨迹颜色为绿色,宽度为 3
,展示了抛体运动的轨迹跟踪效果。
d = Dot().shift(LEFT * 2) trace = TracedPath( d.get_center, stroke_color=GREEN, stroke_width=3, ) self.add(d, trace) def move_path(t): x = t y = 2 - 0.5 * t**2 return np.array([x, y, 0]) f = ParametricFunction( move_path, t_range=(-3, 3), ) self.play(MoveAlongPath(d, f), run_time=3)
2.4. 函数图像绘制过程
这个示例中,定义了一个正弦函数 move_path
,再创建一个点沿着这个正弦函数图像运动,同时创建了一个 TracedPath
对象来跟踪函数图像的绘制过程。
轨迹颜色为紫色,宽度为 2
,且设置轨迹在1
秒后消失。
d = Dot(color=BLUE).shift([-PI, 0, 0]) trace = TracedPath( d.get_center, stroke_color=PURPLE, stroke_width=2, dissipating_time=1, ) self.add(d, trace) def move_path(x): return np.array([x, np.sin(x), 0]) f = ParametricFunction(move_path, t_range=(-PI, PI)) self.play(MoveAlongPath(d, f), run_time=3)
3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(trace.py
),
下载地址: 完整代码 (访问密码: 6872)