本来是想学CSAPP的,结果在B站上看到一个UP主的视频,里面整个视频动画看着很炫,很好玩。评论区看到是由manim做的,了解了下manim刚好也是python做的,正好也在学python,结果看了一期CSAPP就转战manim…
使用过程中还是有好多坑的,比如使用新版的manimgl的线条显示不出来,网上说是把运行显卡由集显切换成独显,要不然就得切换成旧版。。。无奈刚开始是在平板上搭的环境,没有独显。于是切换到旧版manim,使用起来感觉不是很舒服。而且目前的学习资料仅限于官方文档和几位创作者的视频(都是字母动画,没有语音讲解),就重新在我的小本本上搭了环境,主要还是以看文档和源码为主,视频后面看吧!!!!
官方文档网站:
https://docs.manim.org.cn/
manim/
├── manimlib/
│ ├── animation/
│ ├── ...
│ ├── default_config.yml
│ └── window.py
├── (custom_config.yml)
└── start.py
在start.py
中写入如下代码,
from manimlib import *
class SquareToCircle(Scene):
def construct(self):
circle = Circle()
circle.set_fill(BLUE, opacity=0.5)
circle.set_stroke(BLUE_E, width=4)
self.add(circle)
此处运行命令:
manimgl start.py SquareToCircle
就会得到如下窗口:
在这里插入图片描述
接下来介绍下具体执行过程。
manimgl code.py Scene flags
code.py:是你自己的Python文件(此处就是start.py
)
Scene:是你所要渲染的场景;如果没有指定或写错,只有一个Scene,会直接渲染这个场景;多个场景时,会列出所有的让你选择(此处就是SquareToCircle
)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pi5eJmR8-1661696320630)(C:\Users\ZX\AppData\Roaming\Typora\typora-user-images\image-20220828181437013.png)]
此处我在使用实例时,WriteStuff应该是老的一个例子,所以这会列出manim/example_scenes.py中实际所包含的例子来供我选择
flags:选项参数
# 常用选项
-w: 把场景写入文件(--write_file)
-o: 把场景写入文件并打开(--open)
-s: 跳到最后只展示最后一帧(--skip_animations)
-so:保存最后一帧并打开
-n <num>: 跳到场景中第n个动画(--start_at_animation_number)
-f: 打开串口全屏(--full_screen)
-c: 指定背景颜色(--color)
--config_file: 指定配置文件
z键:滚动鼠标中键来缩放画面
f键:移动鼠标来平移画面
d键:同时移动鼠标来改变三维视角
r键:恢复到图像最初视角
q/esc键:关闭窗口并退出程序
# 引入manimlib中的类
from manimlib import *
'''
定义一个Scene的子类,也就是想要编写渲染的场景
这个类名就是在运行命令时指定渲染场景时需要的
'''
class SquareToCircle(Scene):
# 编写construct方法,其中定义了如何创建画面中的物体,以及相应的一系列操作
def construct(self):
# 创建一个Circle实例,也就是一个圆
circle = Circle()
# set_full()方法设置圆的填充颜色,以及透明度
circle.set_fill(BLUE, opacity=0.5)
# set_stroke()设置圆的线条,和线条宽度
circle.set_stroke(BLUE_E, width=4)
# add()方法,将圆添加到画面上
self.add(circle)
# add()也可以替换成play()方法,这样可以看到这个圆的绘制过程
self.play(ShowCreation(circle))
self.embed()
如下就是交互模式,和jupyter的交互界面类似
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypL0MLY2-1661696320635)(C:\Users\ZX\AppData\Roaming\Typora\typora-user-images\image-20220828212325859.png)]
在交互界面输入一下指令
# 在水平方向上拉伸到四倍
self.play(circle.animate.stretch(4, dim=0))
# 旋转180°
self.play(Rotate(circle, TAU / 2))
# 在向右移动2单位同时缩小为原来的1/4
self.play(circle.animate.shift(2 * RIGHT), circle.animate.scale(0.25))
将会得到如下动画:
在上面代码中添加一个正方形,将其在转化为圆形
class SquareToCircle1(Scene):
def construct(self):
circle = Circle()
circle.set_fill(TEAL_B, opacity=0.5)
circle.set_stroke(BLUE_E, width=4)
# 实例化一个正方形
square = Square()
square.set_fill(PURPLE_A, opacity=0.5)
square.set_stroke(PURPLE_A, width=4)
self.play(ShowCreation(square))
self.wait()
# 由正方形切换到圆形
self.play(ReplacementTransform(square, circle))
self.wait()
则会得到如下动画
后续边学边更~~~~