Manim实现渐变填充特效

📅 2026/7/1 1:42:41
Manim实现渐变填充特效
实现原理1.1. 自定义动画类设计在Manim中所有动画效果都是通过继承Animation基类并实现相应的方法来创建的。我们设计了一个名为GradientFillAnimation的类专门用于实现颜色渐变填充效果class GradientFillAnimation(Animation): 动态渐变填充动画类 def __init__(self, mobject, colors, run_time5, **kwargs): 初始化渐变填充动画 Parameters: mobject: 要应用动画的物体 colors: 颜色列表动画将在这些颜色之间进行渐变 run_time: 动画运行时间 self.mobject mobject self.colors colors self.color_count len(colors) super().__init__(mobject, run_timerun_time, **kwargs)这个类接受三个主要参数要应用动画的物体mobject颜色序列colors动画运行时间run_time。颜色序列是一个包含多个颜色的列表动画会在这些颜色之间按顺序进行渐变。1.2. 颜色插值实现动画的核心在于interpolate_mobject方法的实现该方法根据动画进度alpha值范围从0到1计算并更新物体的颜色。def interpolate_mobject(self, alpha): 根据动画进度alpha更新物体的颜色 # 计算当前应该显示的颜色 total_segments self.color_count - 1 segment_progress alpha * total_segments segment_index int(segment_progress) # 确保索引在有效范围内 if segment_index total_segments: segment_index total_segments - 1 # 计算在当前段中的进度 local_progress segment_progress - segment_index # 获取当前段的起始和结束颜色 start_color self.colors[segment_index] end_color self.colors[segment_index 1] # 插值计算当前颜色 current_color interpolate_color(start_color, end_color, local_progress) # 应用颜色到物体 self.mobject.set_fill(current_color)这段代码的工作原理如下首先计算颜色渐变的总段数颜色数量减1根据当前动画进度alpha确定应该处于哪个颜色渐变段计算在当前渐变段内的进度比例获取当前渐变段的起始颜色和结束颜色使用interpolate_color函数在两种颜色之间进行插值计算得到当前应该显示的颜色最后通过set_fill方法将计算得到的颜色应用到物体上通过这种方式我们可以实现物体在多个颜色之间的平滑过渡效果创造出生动的视觉体验。2. 使用示例下面通过两个具体的场景示例来演示如何使用GradientFillAnimation类实现动态渐变填充效果。2.1. 单个物体的渐变效果Example01场景展示了如何为单个物体应用渐变填充动画class Example01(Scene): 演示动态渐变填充特效的场景 def construct(self): # 创建一个圆形 circle Circle(radius2, fill_opacity1) # 定义渐变颜色序列红-蓝-绿-红形成循环 gradient_colors [RED, BLUE, GREEN, RED] # 添加圆形到场景 self.add(circle) # 应用渐变填充动画 self.play(GradientFillAnimation(circle, gradient_colors, run_time4)) # 停留片刻以展示最终效果 self.wait()在这个示例中我们创建了一个半径为2、填充不透明度为1的圆形定义了一个包含四种颜色的渐变序列红-蓝-绿-红形成一个颜色循环将圆形添加到场景中应用GradientFillAnimation动画设置运行时间为4秒动画播放结束后停留片刻以展示最终效果运行这段代码你将看到一个圆形在4秒内从红色平滑过渡到蓝色再过渡到绿色最后回到红色的动画效果。2.2. 多个物体同时应用渐变效果Example02场景展示了如何为多个物体同时应用不同的渐变填充动画class Example02(Scene): 演示多个物体同时使用渐变填充特效的场景 def construct(self): # 创建多个形状 circle Circle(radius1, fill_opacity1) square Square(side_length2, fill_opacity1) triangle Triangle(fill_opacity1).scale(1.5) # 排列形状 circle.shift(LEFT * 2 DOWN) square.shift(RIGHT * 2 DOWN) triangle.shift(UP) # 定义不同的颜色序列 colors1 [RED, YELLOW, BLUE, RED] colors2 [GREEN, PURPLE, ORANGE, GREEN] colors3 [PINK, GOLD, TEAL, PINK] # 添加形状到场景 self.add(circle, square, triangle) # 同时对所有形状应用不同的渐变动画 self.play( GradientFillAnimation(circle, colors1, run_time2), GradientFillAnimation(square, colors2, run_time2), GradientFillAnimation(triangle, colors3, run_time2), ) # 停留片刻以展示最终效果 self.wait()在这个示例中我们创建了三种不同的形状圆形、正方形和三角形并设置了它们的位置为每个形状定义了不同的颜色渐变序列同时对三个形状应用GradientFillAnimation动画设置相同的运行时间2秒运行这段代码你将看到三个形状同时进行颜色渐变但各自遵循不同的颜色变化路径创造出丰富多彩的视觉效果。3. 总结