动态

详情 返回 返回

manim邊學邊做--通用變換 - 动态 详情

在 Manim 動畫製作中,Transform、TransformFromCopy、ReplacementTransform和Restore是四個通用的對象變換動畫類。

這幾個類能夠實現從一個對象到另一個對象的平滑過渡、複製並變換、直接替換以及狀態恢復等多種效果。

Transform:將一個Mobject平滑地變換為另一個Mobject
TransformFromCopy:從一個對象複製出一個副本,並將該副本變換為目標對象
ReplacementTransform:將一個Mobject替換為另一個 Mobject,並且在變換過程中,原始對象會被目標對象完全替代
Restore:將一個Mobject恢復到其之前保存的狀態時使用
通過這些動畫類,我們可以清晰地展示對象之間的關係、強調變換過程、突出替換邏輯,以及靈活地在不同狀態之間切換。

它們在數學公式推導、圖形變換、場景切換等場景中發揮着重要作用,為動畫製作提供了強大的工具,幫助創作者以直觀且富有表現力的方式呈現複雜的概念和過程。

  1. 動畫概述1.1. TransformTransform用於將一個Mobject平滑地變換為另一個Mobject。比如將一個正方形逐漸變為圓形,或者將一段文本替換為另一段文本。它常用於數學公式推導、圖形變換等場景,能夠直觀地展示從一種狀態到另一種狀態的過渡。Transform 是一個通用的變換類,可以對形狀、位置、顏色等多種屬性進行變換。變換過程中,原始對象和目標對象都會保留在場景中,直到動畫結束。如果需要在變換後移除原始對象,需要手動操作。它的參數主要有:參數名稱類型説明mobjectMobject要被變換的對象target_mobjectMobject變換的目標對象path_arcfloat如果使用圓形路徑,指定點移動的弧度path_funcfunc定義了 mobject 的點在變換過程中所走的路徑。可以使用 Manim 提供的路徑函數或自定義函數。path_arc_axisnp.ndarray如果使用圓形路徑,指定旋轉的軸path_arc_centersnp.ndarray如果設置了此參數且未設置path_func,則會生成一個沿圓形路徑的路徑函數。此參數定義了圓形路徑的中心。
  2. replace_mobject_with_target_in_scenebool控制動畫完成後,是否用target_mobject替換mobject1.2. TransformFromCopy當需要從一個對象複製出一個副本,並將該副本變換為目標對象時使用TransformFromCopy。例如,在講解數學公式時,從一個已有的公式中複製一部分並將其變換為新的表達式。TransformFromCopy適用於強調某個對象的複製和變換過程,使觀眾更清楚地看到變換的來源。TransformFromCopy實際上是Transform的一個變體,它先對原始對象進行復制,然後對複製的對象執行變換動畫。原始對象在動畫過程中保持不變,變換的是其副本,這使得動畫效果更加清晰,避免了原始對象的直接改變。它的參數類似Transform的參數。
  1. ReplacementTransformReplacementTransform用於將一個Mobject替換為另一個Mobject,並且在變換過程中,原始對象會被目標對象完全替代。例如,在展示數學公式推導時,將一個公式直接替換為另一個公式,強調兩者的等價性或替換關係。ReplacementTransform適用於需要明確表示對象被替換的場景,強調變換的“替代”性質。ReplacementTransform繼承自Transform類,但它在變換完成後會移除原始對象,只保留目標對象。它更強調“替換”的效果,而不是像Transform那樣保留原始對象和目標對象同時存在一段時間。它的參數類似Transform的參數。
  1. Restore當需要將一個Mobject恢復到其之前保存的狀態時使用Restore。例如,在對一個圖形進行了一系列複雜的變換後,需要將其恢復到初始狀態,或者在展示一個對象的多種變換後,恢復到某個特定的中間狀態。Restore適用於需要反覆展示對象不同狀態的場景,如對比不同變換效果、演示可逆變換等。它需要先通過Mobject.save_state()方法保存對象的狀態,然後才能使用Restore動畫將其恢復。它的參數主要有:參數名稱類型説明mobjectMobject要恢復的對象2. 使用示例下面通過示例來演示這幾個轉換動畫的效果。2.1. 通用轉換Transform這個示例中,將一個數學公式和一個圖形平滑地變換為另一個公式和圖形。變換中,設置了path_arc參數,以一個弧形的路徑變換為目標對象。# 創建初始公式
  2. f1 = MathTex("a^2 + b^2 = c^2").shift(UP)

創建目標公式

f2 = MathTex("c = \sqrt{a^2 + b^2}").shift(DOWN)

創建一個正方形

square = Square(side_length=1, color=BLUE).shift(DOWN)

創建一個圓形

circle = Circle(radius=0.6).shift(UP)

self.add(f1, square)
self.wait()

使用 Transform 將公式1變換為公式2,將正方形變換為圓形

self.play

Transform(f1, f2, path_arc=PI),
Transform(square, circle, path_arc=PI),

圖片
2.2. 比較Replace和Copy的不同通過這個示例,可以瞭解TransformFromCopy和ReplacementTransform兩種動畫效果的區別,幫助我們根據實際需求選擇合適的動畫類。對於TransformFromCopy:從原始對象複製出一個副本,並對副本進行變換原始對象保持不變,變換的是副本適用於需要保留原始對象的場景對於ReplacementTransform:直接將原始對象替換為目標對象原始對象在動畫結束後被移除,目標對象取代其位置適用於需要明確表示對象被替換的場景下面的示例中,TransformFromCopy每次轉換都會保存原對象,而ReplacementTransform則只保留變換後的目標對象。# 創建兩個相同的正方形作為原對象
s1 = Square().shift(LEFT * 1.5)
s2 = Square().shift(RIGHT * 1.5)

創建兩個圓形作為目標對象

c1 = Circle().shift(LEFT * 1.5)
c2 = Circle().shift(RIGHT * 1.5)

t1 = Triangle().shift(LEFT * 1.5)
t2 = Triangle().shift(RIGHT * 1.5)

添加原對象到場景中

self.add(s1, s2)
self.wait(1)

添加標題用於區分兩種變換

title1 = Text(

"TransformFrom Copy",
t2g={"Copy": [BLUE, RED, YELLOW]},
font_size=25,

).next_to(s1, UP)
title2 = Text(

"Replacement Transform",
t2g={"Replacement": [BLUE, RED, YELLOW]},
font_size=25,

).next_to(s2, DOWN)
self.add(title1, title2)
self.wait()

使用 TransformFromCopy 對左邊的圖形進行變換

使用 ReplacementTransform 對右邊的圖形進行變換

self.play

TransformFromCopy(s1, c1),
ReplacementTransform(s2, c2),

self.wait
self.play

TransformFromCopy(c1, t1),
ReplacementTransform(c2, t2),

圖片
2.3. 恢復初始狀態Restore這個示例中,先創建一個六邊形,先變換成星形,再經過一系列其他的變換,比如顏色,透明度,移動,放大,翻轉等變換。最後通過Restore直接恢復成原始狀態。# 創建一個六邊形
hexagon = RegularPolygon(n=6)

保存六邊形的初始狀態

self.add(hexagon)
hexagon.save_state()

將六邊形變換為一個星形

star = Star(color=RED)
self.play(Transform(hexagon, star), run_time=run_time)
self.wait()
self.play(Restore(hexagon))

self.play(hexagon.animate.set_color(YELLOW).set_opacity(0.4), run_time=run_time)
self.play(hexagon.animate.shift(RIGHT).scale(2), run_time=run_time)
self.play(hexagon.animate.rotate(PI * 0.75), run_time=run_time)

使用 Restore 恢復六邊形的初始狀態

self.play(Restore(hexagon))

圖片

  1. 附件文中的代碼只是關鍵部分的截取,完整的代碼共享在網盤中(transform.py)

Add a new 评论

Some HTML is okay.