这篇演示的效果如下:
这是一个较为高级的Manim动画, 动画为3B1B的动画, 需要具备一定的基础知识. 本篇我就来说说这个动画的实现, 其中的一些方法还是很值得大家借鉴的.
准备工作
安装下面这个 Latex, 然后就可以使用更丰富的符号了.
Windows - TeX Live - TeX Users Group 下载 install-tl-windows.exe
自定义动画 FadeInFromPoint 和 FadeOutToPoint.
这两个动画在 Manim 中并没有, 但是我发现在 3b1b 的动画源码中使用的还挺频繁的, 所以干脆抽两个自定义的动画类, 方便后续使用. 大家也可以拿小本本记好, 方便后续直接使用.
FadeInFromPoint
from manim import *
class FadeInFromPoint(Animation):
def __init__(self, mobject: Mobject, point: np.ndarray, **kwargs):
super().__init__(mobject, **kwargs)
self.point = point
self.end = mobject.copy()
def begin(self) -> None:
super().begin()
self.starting_mobject.move_to(self.point)
self.starting_mobject.scale(0.1)
def interpolate_mobject(self, alpha: float) -> None:
new_alpha = self.rate_func(alpha)
self.mobject.become(self.starting_mobject)
self.mobject.scale(new_alpha * 10).move_to(self.point + new_alpha * (self.end.get_center() - self.point))
FadeOutToPoint
from manim import *
class FadeOutToPoint(Animation):
def __init__(self, mobject: Mobject, point: np.ndarray, **kwargs):
super().__init__(mobject, remover=True, **kwargs)
self.point = point
def interpolate_mobject(self, alpha: float) -> None:
new_alpha = self.rate_func(alpha)
self.mobject.become(self.starting_mobject)
self.mobject.scale(1 - new_alpha).move_to(self.starting_mobject.get_center() + new_alpha * (self.point - self.starting_mobject.get_center()))
代码实现
代码流程:
- 创建一个机器的图形, 使用 VGroup 自动将两个三角形对称排列, 然后使用 Union 将多个图形取并集, 设置 z_index=1 表示会覆盖住默认的其他图形.
- 使用 VGroup 竖向排列 24 个数字.
- 循环 12 次, 每次将数字向上挪一个, 然后让数字进入机器, 再让符号从机器出来, lag_ratio=0.4 表示两个动画重叠执行.
- 最后让除了 12 以外的其他数字透明度降低, 同时创建一个矩形外边框圈住 12.
源码我放在公众号"算法铁金库", 欢迎关注并查看.