Manim文档及源码笔记-初级04-SVG图片及文字
涉及方法:
SVGMobject
,ImageMobject
,TextMobject
,TexMobject
,Text
,LaTeX
,cairo
素材文件夹
在manim中使用外部图片或SVG文件时,可以直接使用绝对路径定位文件;也可以放在与manim.py、manimlib同级的文件夹内,使用相对路径。
"C:\\...\\manim\\picture.png"
"/home/.../manim/picture.png"
manim/
├─manim.py
└─mediamlib
| └─ ...
├─picture.png
└─svg_file.png
但更推荐的方法是放在素材目录asset/
中;
asset/
目录并不自带,所以要自己在manim.py的统计目录中创建文件夹:
manim/
├─manim.py
└─mediamlib
| └─ ...
└─assets
asset/
文件夹下还要创建三个子文件夹,分别是:
raster_images/
、svg_images/
、sounds/
(一般不用)
manim/
├─manim.py
└─mediamlib
| └─ ...
└─assets
├─ raster_images
├─ svg_images
└─ sounds
把需要使用的图片素材放到assets/raster_images/
中,需要使用的SVG素材放到assets/svg_images/
中:
manim/
├─manim.py
└─mediamlib
| └─ ...
└─assets
├─ raster_images
| └─picture.png
├─ svg_images
| └─svg_file.svg
└─ sounds
这样之后,仅仅使用文件名(后缀名可省略)manim就可以自动定位到对应文件。
manim中插入SVG
manim中插入SVG图片直接使用SVGMobject即可:
>>> mob = SVGMobject(
)
传入的唯一参数为一个字符串,指向SVG文件(具体写法见上一部分);
关键字参数有stroke_width
(路径粗细)等和VMobject共有的属性;
>>> mob = SVGMobject(
"coin.svg",
color = BLUE,
stroke_width = 5.00
)
由于SVGMobject是VMobject的子类,所以可以使用所有动画效果。
>>> mob = SVGMobject(
"coin.svg",
color = BLUE,
stroke_width = 5.00
)
>>> self.play(Uncreate(mob))
另外,SVGMobject能够处理的和显示有关的SVG元素只有如下几个:
path,rect,circle,ellipse,polygon,polyline;
<?xml ...>
...
<svg ...>
<path d="........." ... />
<rect width="..." height="..." x="..." y="..." ... />
<circle cx="..." cy="..." r="..." ... />
<ellipse cx="..." cy="..." rx="..." ry="..." ... />
<polygon points="... ..." ... />
<polyline potins="... ..." ... />
<image ... />
<text x="..." y="..." ...> ... </text>
</svg>
而其余的元素(例如image和text)都会省略,所以制作SVG时需要注意。
manim中插入图片
在manim中插入图片,需要使用ImageMobject:
>>> img = ImageMobject(
)
与SVGMobject类似,传入一个参数表示图片文件名(jpg,png,gif均可);
height表示插入图片的高度(默认为2),invert表示是否反色(默认False)。
>>> mob = SVGMobject(
"up.png",
height=3,
invert=True
)
ImageMobject不是VGMobject的子类,所以有很多动画无法使用:
>>> mob = SVGMobject(
"up.png",
height=3,
invert=True
)
>>> # self.play(Uncreate(img)) ×
>>> # self.play(Transform(img, square)) ×
>>> self.paly(FadeOut(img))
manim中使用文字
在manim中使用文字,可以使用TextMobject(利用LaTeX编译转换出SVG):
>>> text = TextMobject(
)
传入一个字符串,来表示显示的文字(会套入模板中使用xelatex编译);
其他属性和VMobject的均相同,也可以使用所有动画效果。
>>> img = ImageMobject(
"Text文字",
color=BLUE,
background_stroke_color=RED
)
>>> self.paly(Uncreate(text))
注意:其中需要使用LaTeX命令的\
都需要替换为\\
转义,或在字符串前加’r
’。
一个TextMobject中也可以传入多个字符串,会单独编译,连在一起显示。
>>> img = ImageMobject(
"Text文字",
color=BLUE,
background_stroke_color=RED
)
>>> self.paly(Uncreate(text))
>>> text2 = TextMobject(
"\\LaTeX\\\\换行")
>>> text3 = TextMobject(
r"\LaTeX")
>>> text4 = TextMobject(
"ab", "cde")
一个TextMobject包含一个或多个子物体,指向传入的每个字符串:
text = TextMobject("ab", "cde")
而下一级的子物体,就是这个字符串里的每条路径了(一般是字符),所以可以通过两级下表来访问到每个字符:
书写公式常使用TexMobject,即LaTeX的align*环境:
>>> tex = TexMobject(
)
使用LaTeX的数学公式语法编写公式,结构也和TextMobject类似:
>>> tex = TexMobject(
"\\sum^n_{i=1}i^3=?"
).scale(2)
>>> debugTeX(self, tex[0]
# ↑自定义的显示子物体下表的函数
# 在manim_sandbox中有定义
而TextMobject和TexMobject的区别在于:
- TextMobject直接将内容写在LaTeX的document中;
- 而TexMobject使用了LaTeX的align*公式环境;
\documentclass[preview]{standalone}
\usepackage{...}
...
\usepackage{...}
\begin{document}
TextMobject
\end{document}
\documentclass[preview]{standalone}
\usepackage{...}
...
\usepackage{...}
\begin{document}
\begin{align*}
TextMobject
\end{align*}
\end{document}
所以对于文字和公式,这两种写法是等价的:
TextMobject(“文字$公式$”)↔TexMobject(“\text{文字}公式”)
关于LaTeX公式的预览和教程,可以尝试“妈咪叔”维护的www.latexlive.com
如果只使用文字,或者想自定义字体的话,可以使用Text(需要最新版manim)
>>> tex = Tex(
)
只能传入一个字符串,支持\t
\n
等,还要传入想要使用的字体名称;
还可以传入一个t2c字典来实现自动上色;
>>> tex = TexMobject(
"a bbcde\n\tfghi",
color=BLACK,
font="Consolas",
t2c={"bcd":BLUE},
).scale(2)
Text类是SVGMobject的子类,所以有其全部属性,和动画效果:
>>> tex = TexMobject(
"a bbcde\n\tfghi",
color=BLACK,
font="Consolas",
t2c={"bcd":BLUE},
).scale(2)
>>> self.play(Write(text))
>>> debugTeX(self, text)
一个Text的子物体就是他的每个字符,空格\n
也包括在内,\t
算为4空格。
注:目前版本非显示字符在前一个显示字符的位置上,可能后续会改变~
有关Text的更多方法,可以查看这个官方中文文档:
官方中文文档