Manim實現漸變填充特效
本文將介紹如何使用Manim框架實現動態漸變填充特效,通過自定義動畫類來控制物體的顏色隨時間平滑變化。
1. 實現原理
1.1. 自定義動畫類設計
在Manim中,所有動畫效果都是通過繼承Animation基類并實現相應的方法來創建的。
我們設計了一個名為GradientFillAnimation的類,專門用于實現顏色漸變填充效果:
class GradientFillAnimation(Animation):
"""動態漸變填充動畫類"""
def __init__(self, mobject, colors, run_time=5, **kwargs):
"""
初始化漸變填充動畫
Parameters:
mobject: 要應用動畫的物體
colors: 顏色列表,動畫將在這些顏色之間進行漸變
run_time: 動畫運行時間
"""
self.mobject = mobject
self.colors = colors
self.color_count = len(colors)
super().__init__(mobject, run_time=run_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(radius=2, fill_opacity=1)
# 定義漸變顏色序列:紅->藍->綠->紅(形成循環)
gradient_colors = [RED, BLUE, GREEN, RED]
# 添加圓形到場景
self.add(circle)
# 應用漸變填充動畫
self.play(GradientFillAnimation(circle, gradient_colors, run_time=4))
# 停留片刻以展示最終效果
self.wait()
在這個示例中:
- 我們創建了一個半徑為2、填充不透明度為1的圓形
- 定義了一個包含四種顏色的漸變序列:紅->藍->綠->紅,形成一個顏色循環
- 將圓形添加到場景中
- 應用
GradientFillAnimation動畫,設置運行時間為4秒 - 動畫播放結束后,停留片刻以展示最終效果
運行這段代碼,你將看到一個圓形在4秒內從紅色平滑過渡到藍色,再過渡到綠色,最后回到紅色的動畫效果。

2.2. 多個物體同時應用漸變效果
Example02場景展示了如何為多個物體同時應用不同的漸變填充動畫:
class Example02(Scene):
"""演示多個物體同時使用漸變填充特效的場景"""
def construct(self):
# 創建多個形狀
circle = Circle(radius=1, fill_opacity=1)
square = Square(side_length=2, fill_opacity=1)
triangle = Triangle(fill_opacity=1).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_time=2),
GradientFillAnimation(square, colors2, run_time=2),
GradientFillAnimation(triangle, colors3, run_time=2),
)
# 停留片刻以展示最終效果
self.wait()
在這個示例中:
- 我們創建了三種不同的形狀:圓形、正方形和三角形,并設置了它們的位置
- 為每個形狀定義了不同的顏色漸變序列
- 同時對三個形狀應用
GradientFillAnimation動畫,設置相同的運行時間(2秒)
運行這段代碼,你將看到三個形狀同時進行顏色漸變,但各自遵循不同的顏色變化路徑,創造出豐富多彩的視覺效果。

3. 總結
3.1. 特效特點
通過上面的實現和示例,我們可以總結出這個動態漸變填充特效的幾個主要特點:
- 高度可定制:可以自由定義顏色漸變序列、動畫運行時間等參數
- 平滑過渡:使用顏色插值算法實現顏色之間的平滑過渡
- 靈活性強:可以同時應用于多個物體,并為每個物體設置不同的漸變效果
- 易于集成:作為ManimCE的自定義動畫類,可以輕松集成到任何Manim項目中
3.2. 使用場景
這個動態漸變填充特效在以下場景中特別有用:
- 教學視頻:用于突出顯示重要概念或流程變化
- 數據可視化:通過顏色變化展示數據的變化趨勢
- 品牌宣傳視頻:根據品牌色調創建特色動畫效果
- 藝術創作:用于創建富有表現力的視覺效果
- 演示文稿:增強幻燈片的視覺吸引力
3.3. 技術要點
實現這個特效的關鍵技術要點包括:
- 繼承Manim的
Animation基類并實現interpolate_mobject方法 - 使用
interpolate_color函數進行顏色插值計算 - 根據動畫進度動態更新物體的填充顏色
- 合理組織顏色序列以實現所需的漸變效果
通過掌握這些技術,你可以在Manim中創建出更加生動、有趣的動畫效果,為你的視頻作品增添獨特的視覺魅力。

浙公網安備 33010602011771號