在常用的影片效果中,介紹了一些元素的創建,銷毀,移動和變換的方法,這些方法都是針對單個影片的,
如果需要多個影片互相關聯,或者元素需要有更復雜的運動方式,那么,僅僅依靠常用的影片效果可能就無法滿足要求了,
本篇的高級影片效果主要介紹一些更加靈活的元素運動方式,如何組合多個影片,以及如何聯動多個影片的方式,
掌握了這些方法,就能夠表達出更加復雜的數學幾何影片,
1. 沿著路徑運動
常用的影片一般都是直線運動或者圓弧運動,而 MoveAlongPath
可以讓元素沿著任意的函式軌跡來運動,
下面的示例是一個點沿著一個較為復雜的三角函式形成的路徑運動,
cos_func = FunctionGraph(
lambda t: np.cos(t) + 0.5 * np.cos(7 * t) + (1 / 7) * np.cos(14 * t),
color=RED,
)
sc.add(cos_func)
d1 = dot(cos_func.get_start())
sc.play(MoveAlongPath(d1, cos_func), rate_func=linear, run_time=3)
運行效果:
2. 保留運動路徑
保留影片的軌跡,可以更好的追蹤元素的變化規律,
通過 TracedPath
可以設定保留運動軌跡的效果,
下面的示例是一個點以一定的弧度運行,并將其運行的軌跡繪制出來,
d = dot(RIGHT * 2)
b = TracedPath(d.get_center)
sc.add(d, b)
sc.play(d.animate(path_arc=PI / 4).shift(LEFT * 2))
sc.play(d.animate(path_arc=-PI / 4).shift(LEFT * 2))
運行效果:
3. 影片組合
在常用的影片效果中,一般都是逐個顯示各個影片效果,manim
中提供了幾個控制影片組合的方式,
用的較多的兩個分別是:
- 多個影片組合時,設定每個影片的延遲啟動時間
- 多個影片組合時,前一個影片成功執行后再執行下一個影片
3.1 延遲啟動
通過 LaggedStart
控制組合的多個影片之間的啟動時間間隔,
下面的示例是一個點先啟動,但是要運行1秒才到達終點,
另一個點延遲0.5秒啟動,但是運行0.5秒就到達終點,所以兩個點最終應該同時到達,
d1 = dot(LEFT * 2 + UP, color=RED)
d2 = dot(LEFT * 2 + DOWN)
dl = DashedLine(
RIGHT * 2 + UP * 3,
RIGHT * 2 + DOWN * 3,
dash_length=0.1,
dashed_ratio=0.8,
stroke_width=2,
color=GREEN,
)
sc.add(d1, d2, dl)
sc.wait(0.5)
ani1 = d1.animate(run_time=1).shift(RIGHT * 4)
ani2 = d2.animate(run_time=0.5).shift(RIGHT * 4)
sc.play(LaggedStart(ani1, ani2, lag_ratio=0.5))
運行效果:
3.2 順序啟動
通過 Succession
控制多個影片順序執行,它能夠保證上一個執行成功后才執行下一個,
下面的示例是4個不同顏色的點,每個點移動成功之后,移動下一個點,
dot1 = Dot(point=LEFT * 2 + UP * 2, radius=0.16, color=BLUE)
dot2 = Dot(point=LEFT * 2 + DOWN * 2, radius=0.16, color=MAROON)
dot3 = Dot(point=RIGHT * 2 + DOWN * 2, radius=0.16, color=GREEN)
dot4 = Dot(point=RIGHT * 2 + UP * 2, radius=0.16, color=YELLOW)
sc.add(dot1, dot2, dot3, dot4)
sc.play(
Succession(
dot1.animate.move_to(dot2),
dot2.animate.move_to(dot3),
dot3.animate.move_to(dot4),
dot4.animate.move_to(dot1),
)
)
運行效果:
4. 影片聯動
影片聯動是比影片組合更復雜的一種模式,影片組合時,每個影片其實是固定的,只是啟動的時機不一樣,
而在影片聯動中,一個影片如何運行是完全基于另一個影片的,而不是實作預設的,
下面的示例是一個角度的聯動效果,
初始元素有:
- 兩條線
line1
和line_moving
組成的角度 - 標識角度的一段弧線
a
- 標識角度的字母
tex
- 顯示角度數值的文字
theta_tex
,
初始角度 110°
,然后可以看到隨著 line_moving
的移動(先變成 90°
,再增加 140°
),
a
,tex
和theta_tex
的聯動效果,
rotation_center = LEFT
theta_tracker = ValueTracker(110)
line1 = Line(LEFT, RIGHT)
line_moving = Line(LEFT, RIGHT)
line_ref = line_moving.copy()
line_moving.rotate(theta_tracker.get_value() * DEGREES, about_point=rotation_center)
a = Angle(line1, line_moving, radius=0.5, other_angle=False)
tex = MathTex(r"\theta").move_to(
Angle(
line1, line_moving, radius=0.5 + 3 * SMALL_BUFF, other_angle=False
).point_from_proportion(0.5)
)
theta_tex = Tex(
r"$\theta = $",
str(int(theta_tracker.get_value())),
r"$^\circ$",
font_size=50,
color=RED,
).shift(UP * 2)
sc.add(line1, line_moving, a, tex, theta_tex)
sc.wait()
line_moving.add_updater(
lambda x: x.become(line_ref.copy()).rotate(
theta_tracker.get_value() * DEGREES, about_point=rotation_center
)
)
a.add_updater(
lambda x: x.become(Angle(line1, line_moving, radius=0.5, other_angle=False))
)
tex.add_updater(
lambda x: x.move_to(
Angle(
line1, line_moving, radius=0.5 + 3 * SMALL_BUFF, other_angle=False
).point_from_proportion(0.5)
)
)
theta_tex.add_updater(
lambda x: x.become(
Tex(
r"$\theta = $",
str(int(theta_tracker.get_value())),
r"$^\circ$",
font_size=50,
color=RED,
).shift(UP * 2)
)
)
sc.play(theta_tracker.animate.set_value(90))
sc.play(theta_tracker.animate.increment_value(140), run_time=3)
運行效果:
5. 總結回顧
本篇介紹的高級影片效果,其實是一些更加靈活的制作影片的方法,
利用這些方法,可以更加方便的定制自己的影片效果,
本篇介紹的高級影片效果和上一篇的常用影片效果可以理解成軟體的VIP功能和免費功能,
如果免費功能夠用,盡量使用免費功能,免費功能滿足不了要求的時候,再考慮VIP功能,
本文關聯的微信視頻號短視頻:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550095.html
標籤:Python
上一篇:14面向物件