惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Recent Announcements
Recent Announcements
B
Blog
D
Docker
V
V2EX
GbyAI
GbyAI
L
LangChain Blog
博客园 - Franky
U
Unit 42
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
博客园_首页
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
量子位
Blog — PlanetScale
Blog — PlanetScale
罗磊的独立博客

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
使用 manim 用简单的代码制作精美的动画 - 少数派
2022-06-22 · via 少数派

manim 是视频博主 3Blue1Brown 开发的动画引擎,他使用 manim 创作出了许多直观、美丽的数学科普内容。

3Blue1Brown

可以先看一下我用 manim 制作的一个小动画,之后我会放出代码。

前言

我很早就了解到了 manim,但在很久以后我才尝试去使用它,令我惊讶的是它并没有想象中的麻烦,让我不禁联想到 Apple 的 SwiftUI,使用简单的几句代码,通过「描述」这里存在着什么样的东西,就能制作出想要的效果。

安装

在 mac 终端里分别输入

brew install py3cairo ffmpeg
brew install cmake pango scipy
pip3 install manim

运行第一个项目

manim 是运行在 python 下的,首先创建一个 python 文件 test.py,它基本结构是长这样的。

from manim import * # 导入 manim

class Test(Scene): # 定义一个场景
    def construct(self):
        #code here

新建一个文件夹 manim 用来存放 manim 项目,将文件放入。

为了运行这个项目,你需要先了解一点命令行的知识。

打开 mac 的终端,目前你处于根目录下,输出 ls 可以显示当下目录下的所有文件和文件夹。

输入 cd <文件夹名> 可以进入到这个文件夹。

例如,我的文件夹 manim 是创建在文件夹 Downloads 下的,要进入 manim 文件夹,我需要输入

cd Downloads

cd manim

或者

cd Downloads/manim

进入到 test.py 所在的文件后,可以通过这样一行命令运行项目。

manim test.py Test

这里 Test 是我在上面的示例中定义的场景(Scene)名,manim 每次运行一个文件中的一个场景。

语法

先来看最简单的一个例子

circle = Circle()
self.play(Write(circle))

如此,就创建了这么一个动画

simpleExample

我们通过 circle = Circle() 创建了一个圆,然后播放(play)了 Write(circle) 这个动画。

这就是 manim 的大概逻辑了。

我们来看文章开头的那个例子是怎么实现的。

为了素材的管理方便,我在 manim 文件夹下创建了一个 images 文件夹用来存放图片,在里面放了两个歌手的图片。

注意我这里用的是 .svg 格式的矢量图,因为矢量图可以进行一个物体转变为另一个物体的插值运算。

我在文章 不会设计,如何 1 分钟让土素材变得「上镜」 里讲到如何使用 Vector Magic 将图片转化为矢量图

这时我的文件夹结构是这样的

manim
├─ images
│    ├─ cardiB.svg
│    └─ iggy.svg
└─ test.py

首先引入这两张图片

cardi = SVGMobject("./images/cardiB.svg").shift(LEFT*3).scale(3)

iggy = SVGMobject("./images/iggy.svg").shift(RIGHT*3).scale(3)

. 代表的是当前文件夹,"./images/cardiB.svg" 是图片的路径,一个对象被创建时,它默认位置在画面中心,通过 .shift(LEFT*3).scale(3) 将其往左移动 3 个单位并放大 3 倍。

self.play(Write(cardi), rate_func = smooth, run_time = 3)
self.wait(0.5)

self.play(ReplacementTransform(cardi, iggy), rate_func = smooth, run_time = 3)
self.wait(0.5)
  • rate_func = smooth:动画插值方式为贝塞尔曲线
  • run_time = 3:动画持续实践为 3 秒
  • self.wait(0.5):停顿 0.5 秒

这里我只写了两个动画,一个是创造第一张图片 cardiWrite() 动画,另一个是将 cardi 转变为 iggyReplacementTransform()动画。

学习资源

  • Manim Community:最好理解的文档,但是是英文的,并且需要翻梯子。
  • Manim Kindergarten:这是上面那份文档的中文版,虽说有了中文,但由于并非 1:1 翻译,其实可读性不如上面那份文档

结语

3Blue1Brown 说过,你应该使用 manim 来制作数学科普视频,如果要做其他的视频,比起 manim 有其他更好的选择。

不过,对于程序容易理解的场景(例如字幕出现),使用代码来制作动画比起剪辑软件有着更强的可更改性和复用性,或者,如果你的视频比较简单,只是一些字幕与元素的堆叠,使用 manim 能帮助你快速创建质感很强的动画。

本文只是介绍一个强大的工具,一个用代码制作动画的方式,并非想要替换掉你的工作流,合理运用多个工具的优点,如果你并没有做视频的需求,就当看个乐吧。