manim

参考官网: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/

画不出英文字母的问题,请参考:

Latex error converting to dvi

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. 返回一系列的语句

跟随器, 写在"姿态调整部分"
跟随器:描述部分, 上面有个按钮, 点击弹出编辑对话框
收起的时候只显示"跟随器:描述部分

你可能感兴趣的:(manim)