Manim实现图像变形特效
在数学教学和科普中,通过动画展示抽象概念的动态变化能够显著提升学习者的理解。本文将介绍如何使用 Manim 制作高质量的图像变形特效。
1. 几何形状的平滑过渡
传统的形状变换可能显得僵硬或不自然。通过结合 Transform 和样式动画,可以创建更加流畅和生动的视觉效果。
class SmoothShapeTransition(Scene):
def construct(self):
# 创建初始图形
start_shape = Circle(radius=2, color=BLUE, fill_opacity=0.6)
# 创建目标图形
end_shape = Rectangle(width=4, height=2, color=RED, fill_opacity=0.6).shift(RIGHT * 3)
# 动画:执行形态变换并附加颜色渐变
self.play(
Transform(start_shape, end_shape, path_arc=-PI / 2),
start_shape.animate.set_color(GREEN),
run_time=3
)
self.wait()
上述代码中,path_arc 参数控制了形状变换的路径弧度,从而让动画更加自然。
2. 坐标系之间的无缝切换
在数学场景中,从一个坐标系转换到另一个坐标系时,需要确保曲线和坐标轴同步更新以保持一致性。
class CoordinateSystemTransition(Scene):
def construct(self):
# 定义笛卡尔坐标系及其函数
cartesian = Axes(x_range=[-5, 5], y_range=[-3, 3])
func_cartesian = cartesian.plot(lambda x: np.sin(x), color=BLUE)
# 定义极坐标系及其函数
polar = PolarPlane(radius_max=3).scale(0.7)
func_polar = polar.plot(lambda t: 2 + np.sin(3 * t), color=YELLOW)
# 执行坐标系及函数的同步替换
self.play(
ReplacementTransform(cartesian, polar),
ReplacementTransform(func_cartesian, func_polar),
run_time=2
)
self.wait()
此段代码展示了如何使用 ReplacementTransform 同时替换坐标系和其上的函数曲线,保证了动画的一致性和连贯性。
3. 参数驱动的动态变化
通过动态调整参数值,可以实时改变函数图像的形态,并同步显示参数的变化过程。
class DynamicParameterChange(Scene):
def construct(self):
axes = Axes(
x_range=[-2 * PI, 2 * PI],
y_range=[-5, 5],
axis_config={"color": GREY}
)
# 添加参数标签和数值显示
param_label = MathTex(r"y = b\cos(x)").to_edge(UP).shift(LEFT)
b_label = MathTex("b=").next_to(param_label, DOWN)
b_value = DecimalNumber(1, num_decimal_places=1).next_to(b_label, RIGHT)
group = VGroup(b_label, b_value)
self.add(axes, param_label, group)
# 定义动态更新函数
def update_curve(mob, alpha):
b = interpolate(1, 3, alpha) # 参数从1变到3
new_graph = axes.plot(
lambda x: b * np.cos(x),
color=interpolate_color(BLUE, ORANGE, alpha)
)
mob.become(new_graph)
b_value.set_value(b)
# 初始化函数曲线
initial_curve = axes.plot(lambda x: np.cos(x), color=BLUE)
self.add(initial_curve)
# 播放动画
self.play(
UpdateFromAlphaFunc(initial_curve, update_curve, run_time=4),
rate_func=smooth
)
self.wait()
该示例中,函数图像随着参数 b 的变化而动态调整,同时颜色也通过插值函数进行渐变。