一,介绍
缓动函数 自定义参数随时间变化的速率。 现实生活中,物体并不是突然启动或者停止, 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样,刚开始拉的那一下动作很快, 但是当抽屉被拉出来之后我们会不自觉的放慢动作。 或是掉落在地板上的物体,一开始下降的速度很快, 接着就会在地板上来回反弹直到停止。 这个页面将帮助你选择正确
速率函数的选择,即动画的速度曲线。
接下啦看看非标准的速率函数有那些:
示例代码:
缓动函数(Easing Functions)是用于控制动画过程中对象变化速度的重要工具。它们决定了动画的速率变化,通常以曲线的形式表示。这些函数可以帮助创建更自然和流畅的动画效果。
二,标准缓动函数
线性(Linear):动画的变化速度保持不变,适用于简单的动画。
示例代码:
from manim import *
class RateFunctions1Example10(Scene):
def construct(self):
line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)
line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)
line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)
dot1 = Dot().move_to(line1.get_left())
dot2 = Dot().move_to(line2.get_left())
dot3 = Dot().move_to(line3.get_left())
label1 = Tex("Linear").next_to(line1, RIGHT)
label2 = Tex("Sigmoid").next_to(line2, RIGHT)
label3 = Tex("Smooth").next_to(line3, RIGHT)
self.play(
FadeIn(VGroup(line1, line2, line3)),
FadeIn(VGroup(dot1, dot2, dot3)),
Write(VGroup(label1, label2, label3)),
)
self.play(
MoveAlongPath(dot1, line1, rate_func=rate_functions.linear),
MoveAlongPath(dot2, line2, rate_func=rate_functions.sigmoid),
MoveAlongPath(dot3, line3, rate_func=rate_functions.smooth),
run_time=10
)
self.wait()
二次方缓动(Quad):
- Ease In:开始慢,之后加速。
- Ease Out:开始快,随后减速。
- Ease In Out:开始和结束时慢,中间加速。
标准函数不会导出,因此要使用它们,您可以执行以下操作:
rate_func=rate_functions.ease_in_sine
另一方面,比较常用的非标准函数被导出,可以直接使用。
标准速率函数的示例代码:
from manim import *
class RateFunctions1Example(Scene):
def construct(self):
self.camera.background_color =WHITE
line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)
line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)
line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)
dot1 = Dot(color=BLACK,radius=0.12).move_to(line1.get_left())
dot2 = Dot(color=BLACK,radius=0.12).move_to(line2.get_left())
dot3 = Dot(color=BLACK,radius=0.12).move_to(line3.get_left())
label1 = Tex("Ease In",color=BLACK).next_to(line1, RIGHT)
label2 = Tex("Ease out",color=BLACK).next_to(line2, RIGHT)
label3 = Tex("Ease In Out",color=BLACK).next_to(line3, RIGHT)
self.play(
FadeIn(VGroup(line1, line2, line3)),
FadeIn(VGroup(dot1, dot2, dot3)),
Write(VGroup(label1, label2, label3)),
)
self.play(
MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_sine),
MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_sine),
MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_sine),
run_time=7
)
self.wait()
三次方缓动(Cubic):
- 动画变化较二次方函数更为明显,同样分为Ease In、Ease Out和Ease In Out。
-
示例代码
-
from manim import * class RateFunctionsCubic(Scene): def construct(self): line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED) line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN) line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE) dot1 = Dot().move_to(line1.get_left()) dot2 = Dot().move_to(line2.get_left()) dot3 = Dot().move_to(line3.get_left()) label1 = Tex("Ease In Cubic").next_to(line1, RIGHT) label2 = Tex("Ease out Cubic").next_to(line2, RIGHT) label3 = Tex("Ease In Out Cubic").next_to(line3, RIGHT,buff=0).scale(0.8) self.play( FadeIn(VGroup(line1, line2, line3)), FadeIn(VGroup(dot1, dot2, dot3)), Write(VGroup(label1, label2, label3)), ) self.play( MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_cubic), MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_cubic), MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_cubic), run_time=7 ) self.wait()
指数缓动(Exponential):在动画的初始和结束阶段变化平滑,适合需要快速响应和缓冲的效果。
圆形缓动(Circular):通过圆形路径来实现加速和减速,表现得更为柔和自然。
三,非标准缓动函数
非标准缓动函数通常是开发者自定义的,或是基于标准函数修改而来。它们能够更好地满足特定动画的需求,例如:
-
弹性缓动(Elastic):动画像弹簧一样反复震荡,给人一种回弹的感觉。
-
回弹缓动(Back):在结束前稍微向外突出一下,再回到目标位置,给人一种“回退”的感觉。
-
摩擦缓动(Bounce):模拟弹跳效果,动画到达终点时会有多次回弹的动作。
示例代码:
from manim import *
class RateFunctionsNOTlinear(Scene):
def construct(self):
line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)
line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)
line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)
dot1 = Dot().move_to(line1.get_left())
dot2 = Dot().move_to(line2.get_left())
dot3 = Dot().move_to(line3.get_left())
label1 = Tex("Ease In Bounce").next_to(line1, RIGHT)
label2 = Tex("Ease out Bounce").next_to(line2, RIGHT)
label3 = Tex("Ease In Out Bounce").next_to(line3, RIGHT,buff=0).scale(0.8)
self.play(
FadeIn(VGroup(line1, line2, line3)),
FadeIn(VGroup(dot1, dot2, dot3)),
Write(VGroup(label1, label2, label3)),
)
self.play(
MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_bounce),
MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_bounce),
MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_bounce),
run_time=7
)
self.wait()
缓动函数是为了让动画更加生动、真实,适当选择和应用这些函数能够提高用户体验。