Manim實現圖像變形特效
在數學教學和科普領域,變形效果往往能起到事半功倍的作用,讓抽象的數學概念變得生動形象。
這篇文章將通過三個典型場景,來看看如何超越默認效果的限制,制作出更專業的變形動畫。
1. 幾何體的形態躍遷
傳統形狀變化往往生硬,而通過組合Transform與樣式動畫,我們可以創造更豐富的視覺效果:
class ShapeTransformation(Scene):
def construct(self):
# 創建帶描邊的起始圖形
circle = Circle(radius=1, color=BLUE, stroke_width=8)
circle.set_fill(BLUE_E, opacity=0.5)
circle.shift(LEFT * 2)
# 準備目標圖形并設置不同位置
square = Square(side_length=2, color=RED)
square.shift(RIGHT * 2 + UP)
# 同步執行形態變換和顏色漸變
self.play(
Transform(circle.copy(), square, path_arc=90 * DEGREES),
circle.animate.set_color(YELLOW).shift(RIGHT * 4 + DOWN),
run_time=3,
)
self.wait()
代碼中,我們使用path_arc參數讓變形路徑呈現優美的弧線運動;
并且顏色與位置變化與形態變形同步進行;
一個圖形(圓形)同時轉換成兩個圖形(一個圓形,一個正方形)。

2. 坐標系的魔法轉換
數學場景轉換需要兼顧坐標系和圖形,ReplacementTransform可以完美處理這種復合變換。
class CoordinateTransform(Scene):
def construct(self):
# 創建笛卡爾坐標系
cartesian = Axes(x_range=[-3,3], y_range=[-2,2])
graph1 = cartesian.plot(lambda x: np.sin(x), color=GREEN)
# 準備極坐標系
polar = PolarPlane(radius_max=2).scale(0.8)
graph2 = polar.plot(lambda t: 1+np.cos(3*t), color=YELLOW)
# 組合變換:坐標系與函數曲線同時替換
self.play(
ReplacementTransform(cartesian, polar),
ReplacementTransform(graph1, graph2),
run_time=2
)
# 增強效果:坐標軸顏色漸變
self.play(polar.animate.set_color(BLUE_C), run_time=1.5)
self.wait()
代碼中核心功能在于:
- 同時替換坐標系和函數曲線保持場景一致性
- 使用scale調整坐標系比例確保平滑過渡
- 后期添加顏色動畫強化視覺效果

3. 參數驅動的動態變化
下面通過UpdateFromAlphaFunc實現參數連續變化效果,函數圖像變化的過程中同步更新參數值顯示。
并且在函數圖像變化的過程中,通過顏色插值interpolate_color函數,使得顏色隨參數變化漸變(從綠色變成黃色)。
class ParameterTransformation(Scene):
def construct(self):
axes = Axes(
x_range=[-3 * PI, 3 * PI, PI],
y_range=[-3, 3, 1],
axis_config={"color": WHITE},
)
# 參數連續變化(動態展示a從1到2)
param_label = MathTex(r"y = a\sin(x)").to_edge(UP).shift(LEFT)
self.add(param_label, axes)
a_label = MathTex("a=")
a_value = DecimalNumber(1, num_decimal_places=1).next_to(a_label, RIGHT)
vg = VGroup(a_label, a_value).next_to(param_label, DOWN)
self.add(param_label, axes, vg)
# 創建可變的函數曲線
def update_func(mob, alpha):
a = interpolate(1, 2, alpha)
new_func = axes.plot(
lambda x: a * np.sin(x), color=interpolate_color(GREEN, YELLOW, alpha)
)
mob.become(new_func)
a_value.set_value(a)
dynamic_func = axes.plot(lambda x: 1 * np.sin(x), color=GREEN)
self.add(dynamic_func, a_value)
self.play(
UpdateFromAlphaFunc(dynamic_func, update_func, rate_func=linear, run_time=3)
)
self.wait()
顯示效果如下:

4. 總結
使用Manim的Transform和ReplacementTransform實現數學圖形動態變形。
比如,圓變方、正弦函數振幅連續變化等等,結合顏色插值與參數數值同步更新,直觀演示參數對圖形的影響。

浙公網安備 33010602011771號