python编写3d动画(使用manim用简单的代码制作精美的动画)
manim 是视频博主 3Blue1Brown 开发的动画引擎,他使用 manim 创作出了许多直观、美丽的数学科普内容。
3Blue1Brown
可以先看一下我用 manim 制作的一个小动画,之后我会放出代码。
myExample
前言我很早就了解到了 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 秒
这里我只写了两个动画,一个是创造第一张图片 cardi 的 Write() 动画,另一个是将 cardi 转变为 iggy 的 ReplacementTransform()动画。
学习资源- Manim Community:最好理解的文档,但是是英文的,并且需要翻梯子。
- Manim Kindergarten:这是上面那份文档的中文版,虽说有了中文,但由于并非 1:1 翻译,其实可读性不如上面那份文档
3Blue1Brown 说过,你应该使用 manim 来制作数学科普视频,如果要做其他的视频,比起 manim 有其他更好的选择。
不过,对于程序容易理解的场景(例如字幕出现),使用代码来制作动画比起剪辑软件有着更强的可更改性和复用性,或者,如果你的视频比较简单,只是一些字幕与元素的堆叠,使用 manim 能帮助你快速创建质感很强的动画。
本文只是介绍一个强大的工具,一个用代码制作动画的方式,并非想要替换掉你的工作流,合理运用多个工具的优点,如果你并没有做视频的需求,就当看个乐吧。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com