manim 4.0 预备知识
1、Vmobject的认识
由handles和anchors决定,可以改变Vmobject.points来实现
2、动画的认识
最重要的是补间(interpolate),其由alpha决定
2.1、updater ——> animation
我们可以添加updater来实现更新,同时也可以使用UpdateFromFunc()实现更新:
def anim(a): a.next_to(b, RIGHT) sp(UpdateFromFunc(dot, anim)) # 传入函数对象
UpdateFromAlphaFunc()需要额外传入一个参数alpha,代表函数的进程,我们可以实现边旋转边移动:
def myrotate(a, alpha): a.restore() # 使用restore()是因为移动的距离、旋转的角度是相对初始位置而言的 a.shift(10*r*alpha) a.rotate(2*PI*alpha) a.save_state() sp(UpdateFromAlphaFunc(b, myrotate))
我们甚至可以实现transform的效果:
c = Circle() s = Square() def anim(a, alpha): a.set_points(interpolate(c.get_all_points(), s.copy().align_points(c).get_all_points(), alpha)) # 对锚点插值 sa(c) sp(UpdateFromAlphaFunc(c, anim))
2.2、animation ——> updater
updater可以含时,这样物件会基于事件进行更新,而无视alpha的进度:
def anim(a, dt): a.rotate(dt, about_point = o) s = Square() s.add_updater(anim)
s.add_updater(lambda a, dt: a.rotate(-np.exp(a.get_angle()) * dt))
有一个类可以将animation变为updater:
anim = FadeIn(s, rate_func = there_and_back) turn_animation_into_updater(anim, True) # True代表循环播放 s.add_updater(…) # 在此期间可以添加其他的更新 sa(s) sw()
自定义动画:
class myanim(Animation): def __init__(self, mob, start: float, end: float ,**kwargs): super().__init__(mob, **kwargs) self.start = start self.end = end def interpolate_mobject(self, alpha: float): value = self.start + (alpha * (self.end - self.start)) self.mobject.restore() self.mobject.scale(value).set_color(rgb_to_color([alpha, alpha, 0.5]))
当然也可以添加其他部分,比如 begin(),见:https://www.bilibili.com/video/BV1hN4y1u75o/?spm_id_from=333.999.0.0&vd_source=ae974fbadae10578cb0959bdda001797
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异