首页 > 编程语言 >manim 4.0 源码解析

manim 4.0 源码解析

时间:2023-01-09 15:58:04浏览次数:66  
标签:None target self vertex Scene 源码 manim mobject 4.0

这一切都可以在 https://docs.manim.community/en/stable/guides/deep_dive.html 中找到

首先,我们知道,manim 的主要组成部分为:mobject, animation 和 scene

其中,我们只要理解前两者就可以了,我们不关心 scene 是如何将动画呈现在画布上的

 

Mobject

Mobject 分为 ImageMobject, PMobject 和 VMobject,顾名思义,分别为 图像物件、点物件和矢量物件,其中最重要的是 VMobject

我们观察 Mobject 的初始化:

    def __init__(self, color=WHITE, name=None, dim=3, target=None, z_index=0):
        self.name = self.__class__.__name__ if name is None else name
        self.dim = dim
        self.target = target
        self.z_index = z_index
        self.point_hash = None
        self.submobjects = []
        self.updaters = []
        self.updating_suspended = False
        self.color = Color(color) if color else None

        self.reset_points()
        self.generate_points()
        self.init_colors()

可以看到,所有基于 Mobject 的类都会自动 generate_points,这是因为 VMobject 是通过锚点和手柄来呈现的

例如,我们观察几何图形基类 Polygram:

class Polygram(VMobject, metaclass=ConvertToOpenGL):
    def __init__(self, *vertex_groups: Iterable[Sequence[float]], color=BLUE, **kwargs):
        super().__init__(color=color, **kwargs)

        for vertices in vertex_groups:
            first_vertex, *vertices = vertices
            first_vertex = np.array(first_vertex)

            self.start_new_path(first_vertex)
            self.add_points_as_corners(
                [*(np.array(vertex) for vertex in vertices), first_vertex],
            )

它使用了 VMobject 的 start_new_path 和 add_points_as_corners 方法来呈现

 

Animation

这个动画基类在渲染中这几个方法会被调用:

Animation.begin()
Animation.finish()
Animation.interpolate()

例如,我们观察 Transform 的方法:

    def begin(self) -> None:
        # Use a copy of target_mobject for the align_data
        # call so that the actual target_mobject stays
        # preserved.
        self.target_mobject = self.create_target()
        self.target_copy = self.target_mobject.copy()
        # Note, this potentially changes the structure
        # of both mobject and target_mobject
        if config.renderer == RendererType.OPENGL:
            self.mobject.align_data_and_family(self.target_copy)
        else:
            self.mobject.align_data(self.target_copy)
        super().begin()

    def interpolate_submobject(
        self,
        submobject: Mobject,
        starting_submobject: Mobject,
        target_copy: Mobject,
        alpha: float,
    ) -> Transform:
        submobject.interpolate(starting_submobject, target_copy, alpha, self.path_func)
        return self

注意,Animation 的这两个方法几乎等同:

def interpolate(self, alpha: float) -> None:
        self.interpolate_mobject(alpha)

 

Scene

它有三个重要的方法:

Scene.setup()
Scene.construct()
Scene.tear_down()

实际上,我们对 Scene 的构造并不感兴趣,因为这部分是最复杂的,它牵涉到实现代码转 mp4 的过程,但是其中含有 Animation 的相关部分。我们注意到,Animation 的 interpolate() 的方法在初始化的时候并没有调用,那么什么时候它起作用了呢?实际上,在 Scene 部分中才真正调用了这个方法:

    def update_to_time(self, t):
        dt = t - self.last_t
        self.last_t = t
        for animation in self.animations:
            animation.update_mobjects(dt)
            alpha = t / animation.run_time
            animation.interpolate(alpha)
        self.update_mobjects(dt)
        self.update_meshes(dt)
        self.update_self(dt)

这也就说明了,manim 的动画实现过程部分会杂糅在 Scene 的实现过程中。例如,我们知道,对 VMobject 传入 points 属性,可以实现可视化的贝塞尔曲线,可是我始终没有找到实现这部分原理的方法,可能就是杂糅在 Scene 部分中

标签:None,target,self,vertex,Scene,源码,manim,mobject,4.0
From: https://www.cnblogs.com/daxiangcai/p/17037253.html

相关文章

  • 视频直播app源码,vue实现列表自动滚动的方式
    视频直播app源码,vue实现列表自动滚动的方式设置定时器,每三秒,让列表向上移动一行的高度,然后当最后一条数据出现时,在下一个三秒后,恢复到初始状态。 下面是上面描述的代码......
  • Spring事务的类层次结构及核心源码
    如果有这么一个需求:支持所有数据库系统的事务管理,包括获取事务、提交事务和回滚事务。你会怎么设计?本文介绍Spring是如何设计事务管理功能,将事务管理中的各个功能抽象成......
  • ThreadLocal源码解析及实战应用
    作者:京东物流闫鹏勃1什么是ThreadLocal?ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal......
  • eth evm 源码分析
    ETH源码分析入口函数:ransitionDb()func(st*StateTransition)TransitionDb()(*ExecutionResult,error){//首先检查此消息是否满足之前的所有共识规则//应用消......
  • Input源码解读——从"Show tabs"开始
    Input源码解读——从"Showtabs"开始本文基于AndroidT版本源码,梳理当用户在开发者选项中开启Showtabs功能后显示第点按操作的视觉反馈的原理,来进一步了解AndroidInput......
  • java弹幕视频网站源码
    简介Java基于ssm的弹幕视频系统,用户注册后可以上传视频进行投稿,也可以浏览视频发送弹幕,在个人中心管理视频、管理弹幕、管理评论等。管理员可以管理视频弹幕评论,查看统计......
  • java食堂库存管理系统源码
    简介Java基于sprinboot开发的食堂库存管理系统,用于统计食堂库存的,包含采购、入库、出库、折损等功能。演示视频https://www.bilibili.com/video/BV1Jf4y1C7vq/?share_s......
  • java基于ssm空气质量检测系统源码网站空气质量监测源码
    简介Java基于ssm的空气质量检测系统,检测设备检测一定范围内的企业空气指数,如果有污染则地图显示红色标记。演示视频https://www.bilibili.com/video/BV1GK4y1W7JB/?shar......
  • Snort IDS 源码安装直播课预告
        本周日上午9:00-9:30,在B站的直播课《从0开始安装SnortIDS》分享课来啦!直播环境UbuntuLinux18.0.4地址:​​https://b23.tv/YhosbC9​​2022年51CTO学堂讲......
  • 痞子衡嵌入式:MCUBootUtility v4.0发布,开始支持MCX啦
    --痞子衡维护的NXP-MCUBootUtility工具距离上一个大版本(v3.5.0)发布过去9个月了,这一次痞子衡为大家带来了版本升级v4.0.0,这个版本主要有两个重要更新需要跟大家......