视频效果
代码一览
from manim import *
class Beginning(Scene):
def construct(self):
title = Text("胡说数学",font="ipix_12px",font_size=DEFAULT_FONT_SIZE*2)
subtitle_vol = Text("第一集",font="ipix_12px")
subtitle = Text("从数羊开始的数字",font="ipix_12px")
author = Text("By Nickwald",font="ipix_12px")
l = Line(UP,DOWN)
subtitle_vol.next_to(title,RIGHT+DOWN*0.8,buff=-2)
subtitle.next_to(title,RIGHT+UP*0.7,buff=-2)
l.next_to(title,RIGHT,buff=-2.5)
author.next_to(l,DOWN,buff=LARGE_BUFF)
titleWriteIn = [
Write(subtitle_vol),
Write(subtitle)
]
titleFadeOut = [
FadeOut(title),
FadeOut(subtitle_vol),
FadeOut(subtitle),
FadeOut(l),
FadeOut(author)
]
self.play(Write(title))
self.play(title.animate.shift(LEFT*3))
self.play(Create(l))
self.play(AnimationGroup(*titleWriteIn))
self.play(Write(author))
self.wait()
self.play(AnimationGroup(*titleFadeOut))
self.wait()
代码讲解
固定格式
首先,使用manim制作视频时,都需要在开头添加manim库:
from manim import *
接下来,我们便需要创建一个场景:
class YourSceneName(Scene):
def construct(self):
需要注意的是,一个代码文件中可以存在多个场景,看起来可能是这样的:
class SceneName1(Scene):
def construct(self):
//Your code here...
class SceneName2(Scene):
def construct(self):
//Your code here...
如果有多个场景,在使用manimCE渲染时,需要你选择要渲染的场景。
一般文字(Text对象)
[tip type='info']manimCE中的Text对象说明:说明文档 [/tip]
注意到之前的代码中有这样一行:
title = Text("Section 1:从数羊开始……",font="ipix_12px",font_size=30).to_corner(UL)
这行代码做了两件事:
- 创建Text对象
- 设置Text位置
我们逐个分析。
线
l = Line(UP,DOWN)
这里创建了一个线的对象,但是,为什么是UP
和DOWN
呢?
[tip type='info']如果有一定线性代数基础,那么我们容易知道,变换和坐标都可以通过数学上的矩阵去描述。[/tip]
事实上,manim中的UP
,DOWN
等常量本质上就是一个矩阵,所以上文中的DOWN*3
也就不难理解了。
另一种使用Line的方式为:
dot1 = Dot(point = UL)
dot2 = Dot(point = DR)
l = Line(dot1, dot2)
这段代码实现的是连线dot1
和dot2
。
动画播放
前面都是初始化的步骤,接下来,我们将决定对象将以怎样的方式去展现。
很庆幸的是,manim已经帮我们内置了极多的动画方法,我们可以直接使用,就可以实现丰富高级的动画。
基本的代码格式是:
self.play(Animations)
实现"书写"文字
Write(Object)
[tip type='info']manim所有的动画效果都必须放在self.play()
的括号中,不然会出现"闪现"的情况。这是因为self.play()
会自动插值,使得坐标变换等移动变得顺滑。[/tip]
Write()
默认从左往右"书写"文字,如果想从右往左,仅仅需要将reverse
属性设置为True
。下面是一个具体的例子
self.play( Write(textObject, reverse=True) )
动画组
一般动画是逐个播放的,比如先是"画一条线",然后再"移动这条线"。但是,有时候我们想让几个动画同时进行,比如"在向左移动的同时将自身的透明度从0变为1"。这个时候,我们便需要引入动画组的概念。
# 定义一个动画组
titleFadeOut = [
FadeOut(title),
FadeOut(subtitle_vol),
FadeOut(subtitle),
FadeOut(l),
FadeOut(author)
]
# 播放动画组
self.play(AnimationGroup(*titleFadeOut))
类似数组一样,我们仅仅需要将要同时播放的动画放进去,然后使用AnimationGroup()
方法即可。唯一需要注意的是,括号内动画组名字的开头需要添加星号。