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

posted @   树叶本子  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示