参考官网:https://github.com/3b1b/manim
还有一个重要网站(需要才能打开:https://www.reddit.com/r/3Blue1Brown/comments/b1porr/how_to_run_manim_on_windowsguide/)
首先下载32位python 3.7.3安装。
下载win32静态连接的ffmpeg包,三个exe,复制到c盘根目录,然后收到加环境变量
下载 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycairo,安装这个非常容易出错
下载1.18.1的win32版本,我下载的名字:
pycairo-1.18.1-cp37-cp37m-win32.whl
然后按照reddit上面手动安装:
python -m pip install pycairo-1.18.1-cp37-cp37m-win32.whl的绝对路径
安装成功之后,需要到manim目录中,打开requirements.txt删掉pycairo两行,一行是linux,
一行是win32,因为之前已经手动安装过了。
还需要安装:
python -m pip install pyreadline
接着安装https://miktex.org/download
接着安装https://sourceforge.net/projects/sox/
然后从github上https://github.com/3b1b/manim
下载zip包解压,到manim目录中:
python -m pip install -r requirements.txt
最后运行一个例子:
python -m manim .\example_scenes.py WriteToCircle -pl
目前看到两个教程不错,一个是github上面的:
https://github.com/malhotra5/Manim-Tutorial
另外一个是:
https://talkingphysics.wordpress.com/2019/01/08/getting-started-animating-with-manim-and-python-3-7/
上主页可以看各种视频:
https://www.3blue1brown.com/
画不出英文字母的问题,请参考:
https://github.com/3b1b/manim/issues/207
中文有问题请看:
https://github.com/3b1b/manim/issues/209
目前还有个问题就是中文只有两个字时会出错。
=======================================================
print("%s is number %d", "y", 1)
形状(参见geometry.py):
Square
Circle
Arc
ArcBetweenPoints
CurvedArrow
CurvedDoubleArrow
Dot(Circle)
SmallDot(Dot)
Ellipse(Circle)
AnnularSector(Arc)
Sector(AnnularSector)
Annulus(Circle)
Line(TipableVMobject)
DashedLine(Line)
TangentLine(Line)
Elbow(VMobject)
Arrow(Line)
Vector(Arrow)
DoubleArrow(Arrow)
CubicBezier(VMobject)
Polygon(VMobject)
RegularPolygon
Triangle(RegularPolygon)
ArrowTip(Triangle)
Rectangle(Polygon)
RoundedRectangle(Rectangle)
NumberPlane笛卡尔坐标系,包含两个坐标轴和坐标
-pl选项是Preview and Low quality
动画类型(都在animation目录当中):
ShowCreation(circle)
FadeOut(circle)
FadeIn(circle)
=====================================================================
动画:
Rotating(square, axis=OUT)逆时针转,axia=IN顺时针转
MoveAlongPath, 沿着某个路径移动
GrowArrow,显示箭头动画
ApplyMethod(circle.move_to, 向右,向上,向左,需要RIGHT, RIGHT+UP, LEFT+UP
不能写成RIGHT, UP, LEFT
ApplyMethod(circle.shift, RIGHT, RIGHT+UP, LEFT+UP, 先是向右, 右上,左上
MoveToTarget很神奇很有用,把一个图形移动到它的目标,移动之前先要
设置它的target为目标图形
=====================================================================
静态变换:
flip翻转,静态变换, RIGHT, LEFT上下翻转, UP, DOWN左右翻转
surround,圆包围其他图形
Transform从一个图形到另外一个图形,第二个图形出现在屏幕上就没有办法再消除了?
有弧度的箭头CurvedArrow,提供起始点,角度以及颜色
所有的颜色变量都在constant.py文件中的COLOR_MAP字典里面
默认的屏幕高度是8个单位,宽度为14.2个单位。
方向矢量:UP, RIGHT, LEFT, DOWN, IN, OUT每个矢量一个单位长度
屏幕的四个边:TOP, BOTTOM, LEFT_SIDE, RIGHT_SIDE
wait()默认等待一秒
两个物体,transform之后,改变原来物体的属性有效
文字对齐:
和屏幕四个边的中间对齐(to_edge):
UP, DOWN, LEFT, RIGHT
和角落对齐(to_corner):
UP+LEFT
实测VGroup里面添加的东西是由顺序的,最右边的会覆盖左边的
用VGroup的arrange_submobjects方法把两行文字上下排列,第一个参数用DOWN
矩形包围一行文字,TexMobject, 默认情况下,矩形比文字高不少,有空隙,改成这样
rec1.surround(eq1_mob, stretch=True, buff=0.2)
在坐标平面内绘制函数图象,self.get_graph
从函数曲线上一点画到x轴的直线,
get_vertical_line_to_graph
画函数曲线两个x轴坐标之间围城的区域,用get_area(func_graph, x_min, x_max)这个函数,非常漂亮
给函数曲线加标题,用get_graph_label函数
input_graph_label给定x坐标,得到y坐标
生成一个数组,在中括号中间用for循环
python slice operator, [:]
用pycharm调试manim程序,Run/Debug Configurations
Script path:选择manim.py
Parameters:选择example_scenes.py MovingCharges -pl
显示弧符号有问题,加载
\usepackage{fourier}
使用上面的之后,需要运行updmap.exe,无论是管理员还是非管理员都行
头部需要一排提示区域
缩放
括号
位置调整
===============================================================
Mobject结构:
submobjects数组
updaters数组, 一个对象可以添加多个更新器
apply_function, 施加变化
Animation结构:
=================================================================
1. 多个物体一起运动, 带有alpha参数, 需要做出特殊的比如物体上升减速, 下降加速
UpdateFromAlphaFunc
需要写一个函数
一般用VGroup, 还需要copy一个作为基本的组
这个方法不需要依赖第三方的self.play动画, 但是写法较为复杂
2. 多个物体一起运动, 依赖第三方动画, 把多个物体组织成一个VGroup
也需要写一个函数
要调用add_updater
group必须加到场景里面去, self.add(grp)
但是group的作用好像不大, 甚至创建一个空的group都可以
定义的函数必须位于add_updater(update_a)之前
函数名称如何取? 名字无所谓, 需要一个全局变量跟踪
update1
update2, update3, update4, update5等等
分组:点1,点2
===================================================
按照目前自定义的对话框来编写
跟随动画, 随着另外一个物体运动而运动
这一部分应该放在姿态调整这一块
grp = VGroup(dt1, dt2, dt4)
self.add(grp)
def shit1(mob):
v = dt3.get_center()[0]
dt1.move_to(np.array([v, 1, 0]))
dt2.move_to(np.array([v, 0, 0]))
dt4.move_to(np.array([v, -2, 0]))
grp.add_updater(shit1)
0. 系统弹出对话框时定义一个函数名称update1
1. 把调整姿势部分涉及到的物体都罗列出来
dt1, dt2, dt4
2. 创建一个VGroup, 把dt1, dt2, dt4加进去
3. self.add加入那个VGroup
4. def update1(mob):
5. 罗列定义部分和姿态调整部分的语句
6. 返回一系列的语句
跟随器, 写在"姿态调整部分"
跟随器:描述部分, 上面有个按钮, 点击弹出编辑对话框
收起的时候只显示"跟随器:描述部分