高大上的数学科普视频,敲敲代码就能出来!

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!


先请大家看一个短视频,只有 15 秒。

厉害吧!猜猜这个视频的制作要花多久?

只需要 55 行代码,估算下来的话可能只需要几分钟的时间,就生产出来了这样一个质量看上去很不错的视频了。

本文想要向大家分享的,就是这个数学科普视频制作背后的利器:Manim。

Manim 最近登上了 Github 上的热门项目榜,而且是排名第一。它其实是一个专业输出数学科普视频的动画引擎。登上热门榜单,就是因为它足够强大,功能尤其神奇。

Manim 是基于 Python 语言实现的,具体安装方法这里不做详细介绍,大家可以在项目文档中找到。我们主要来欣赏一下 Manim 的具体用法和神奇强大之处。

不想安装项目,但是又想了解项目的小伙伴,可以通过项目提供的 Jupyter Notebook 进行体验。地址如下:https://mybinder.org/v2/gh/ManimCommunity/jupyter_examples/HEAD?filepath=basic_example_scenes.ipynb

一个简单的示例

这个例子,展示了一个正方形如何变换成圆形。代码不多,就 10 来行:

from manim import *


class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        square = Square()
        square.flip(RIGHT)
        square.rotate(-3 * TAU / 8)
        circle.set_fill(PINK, opacity=0.5)

        self.play(Create(square))
        self.play(Transform(square, circle))
        self.play(FadeOut(square))

怎么查看视频呢?我们将上述代码,保存在一个名为 example.py 的文件中,然后在命令行中执行如下命令:

manim -p -ql example.py SquareToCircle

这个时候,系统默认的播放器就会弹出,然后播放下面这个视频:

用法说明

从上面的例子,可以看出 Manim 提供了一个命令行工具,给定文件及文件中的类后,即可执行命令。具体说明如下图所示:

上图命令中,-p 表示我们要预览最终视频文件,这样程序完成视频渲染后就会自动打开文件。-ql 表示用较低的质量进行快速渲染。

其他可能会用到的标签如下:

  • -s 可以跳到视频最后一帧

  • -n <数字> 可以跳到某个场景的第 n 个动画

  • -f 在文件浏览器中展示视频文件

Jupyter集成

在命令行使用 Manim,看上去还是不太方便的,要保存文件并执行命令。为了方便开发者,Manim 还提供了一个 IPython 魔法命令:%%manim,支持在 Jupyterlab 中使用。

上面提到的示例,就可以查看具体的使用方式了。

文首视频背后的代码

最后贴一下最开始分享视频的代码,55 行左右而已,爱折腾的小伙伴下班后赶快体验起来吧!

from manim import *

class OpeningManim(Scene):
    def construct(self):
        title = Tex(r"This is some \LaTeX")
        basel = MathTex(r"\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}")
        VGroup(title, basel).arrange(DOWN)
        self.play(
            Write(title),
            FadeIn(basel, shift=DOWN),
        )
        self.wait()

        transform_title = Tex("That was a transform")
        transform_title.to_corner(UP + LEFT)
        self.play(
            Transform(title, transform_title),
            LaggedStart(*[FadeOut(obj, shift=DOWN) for obj in basel]),
        )
        self.wait()

        grid = NumberPlane()
        grid_title = Tex("This is a grid")
        grid_title.scale(1.5)
        grid_title.move_to(transform_title)

        self.add(grid, grid_title)  # Make sure title is on top of grid
        self.play(
            FadeOut(title),
            FadeIn(grid_title, shift=UP),
            Create(grid, run_time=3, lag_ratio=0.1),
        )
        self.wait()

        grid_transform_title = Tex(
            r"That was a non-linear function \\ applied to the grid"
        )
        grid_transform_title.move_to(grid_title, UL)
        grid.prepare_for_nonlinear_transform()
        self.play(
            grid.animate.apply_function(
                lambda p: p
                          + np.array(
                    [
                        np.sin(p[1]),
                        np.sin(p[0]),
                        0,
                    ]
                )
            ),
            run_time=3,
        )
        self.wait()
        self.play(Transform(grid_title, grid_transform_title))
        self.wait()

题图:pexels,CC0 授权。

????分享、点赞、在看,给个三连击呗????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值