做出高逼格的数学动画

您所在的位置:网站首页 matelable软件做什么的 做出高逼格的数学动画

做出高逼格的数学动画

2024-06-17 02:13:17| 来源: 网络整理| 查看: 265

我们来讲如何从0基础用manim(mathematical animation engine)一步步做出像3B1B那样的高逼格数学动画。这一期为入门教程,主要讲解manim的安装和基础操作。

什么是manim?GitHub上的解释为“Manim is an animation engine for explanatory math videos. It's used to create precise animations programmatically, as seen in the videos at 3Blue1Brown.”简单讲就是能做出类似3Blue1Brown那样的高逼格的解释性的数学动画的一个基于python编写的动画引擎(使用时也离不开python编程),其效果如下图所示:

3B1B视频中的一些图片

B站上也有不少3Blue1Brown的粉丝及不少数学爱好者,我也是其中之一。就在前不久自己学习了一些manim的相关知识,但在学习的时候发现能找到的教程很少,因此在这里将学习过程中的一些东西整理分享一下。

1.manim的安装

虽然我在装mamin的时候没遇到太大的困扰,但manim的安装过程还是不太容易的。好在B站上有大佬把这部分整理得足够好,因此我们按照下面所给的方法进行安装应该没啥问题:

视频教程:

图文教程:

1.图文教程1

2.图文教程2

以上安装教程都是在Windows系统python3.7的基础上安装的manim,本文中的其他例子也是使用python3.7.2编写。因此在安装学习前,确保电脑电脑装了python3.7并最好有一定的python基础。

2.第一个简单程序——Hello World!

我们先花一分钟时间,来做一个最简单的例子——HelloWorld,通过它来熟悉使用manim做一段视频的流程。我们打开PyCharm或其他idle,输入下面所示的python代码,将其保存为HelloWorld.py(或你自己定的文件名)

第一个简单例子——HelloWorld.py第一个例子Hello_World.py

我们来解释一下代码的含义:

from big_ol_pile_of_manim_imports import * 就是从一个叫big_ol_pile_of_manim_imports.py的文件中导入了一大堆我们所需要用到的模块,省的自己再去挨个导入了;

class Hello_World(Scene)创建力一个继承自Scene的一个类;

def construct(self):construct方法对于manim很特殊,manim调用这个方法来创建动画。所以基本上这个方法是在运行manim时必不可少的;

helloworld = TextMobject("Hello World!", color=RED)创建了一个叫helloworld的对象,颜色为红色(RED),你也可以直接输入十六进制的颜色代码或其他颜色名称(如YELLOW,BLUE_B等,这个在manimlib.constants的COLOR_MAP可以查到);

self.play(Write(helloworld)),这个很好理解,写下helloworld的对象对应的文本;

self.wait(1),等待一秒,即“Hello World!”保持在屏幕中一秒

要利用上述代码及manim生成动画,我们可以打开cmd,cd进入manim-master目录输入:

python -m manim HelloWorld.py Hello_World -pl

(注意区分大小写)

其中,有的人得将python改为python3或python37(看你python目录下python.exe是怎么命名的);HelloWorld.py为你要运行的文件名,Hello_World为类名(你也可以不用输入蓝字,届时cmd会弹出一句话来让你用数字来选择,你再选择你想运行的类即可);-pl会生成低质量的动画(480P15),改为-pm会生成中等质量的动画(720P30)。运行后结果如下(我用的是PowerShell,和cmd运行的结果一样):

PowerShell运行结果截图(并不会动)

我们完成渲染的动画都会统一保存在manim同一目录下的media文件夹下(除非你手动进行了更改)

3.循序渐进——Hello Manim!

第一个HelloWorld的代码让我们熟悉了manim的工作流程,现在我们再此基础上稍微改进,其代码如下:

一点小小的改进——HelloManim.py

和之前差不多的代码想必大家已经很熟悉,说说新增的代码:

rectangle = Rectangle(color=BLUE),建立一个矩形对象rectangle;

rectangle.surround(helloworld)该矩形是刚好包裹住helloworld;

group1 = VGroup(helloworld, rectangle)将这两个东西合并为一个群组(VGroup)里(这里群组是我自己翻的,所有的Mobject(helloworld, rectangle等都属于Mobject对象)都能放到一个VGroup里,且VGroup可以嵌套,这样对这一堆Mobject操作会很方便);

hellomanim.scale(2.5)为设置hellomanim的大小,Mobject创立之后可以使用scale,set_color,set_height等来改变其大小、颜色、尺寸等属性,上面的rectangle.surround也是如此;

self.play(FadeIn(rectangle)),FadeIn让矩形渐入显示,self.play()里面可以play各种动画方式,常用的有Write,FadeIn,FadeOut, Transform等,根据字面意思很好理解;

self.play(ApplyMethod(group1.scale, 2.5)),将group1整体放大2.5倍

我们运行一下程序,看看效果,得到动画如下图所示:

HelloManim.py运行后产生的动画

每次都用cmd或PowerShell来运行manim还是不太方便,我们用python在manim对应的目录下写了如下的脚本,能让我们在pycharm中直接调试运行manim:

运行这个python文件结果和在cmd中调试结果一样

这其实就是把需要在cmd中输入的字符串保存到run_manim.bat文件中再用python运行它,不用每次都在cmd下面弄。

4.图形基础

在上面的例子中我们画了一个矩形,在这部分我们集中把和图形相关的基础的东西讲一下。

实例一:滑轮——掌握基本的图形创建

python代码如下:

BasicShapes.py——用基本图形拼一个滑轮

在这里做如下几点说明:

我们把construct函数的代码分为了三个部分,在## Making object部分我们创建了物体并赋予其大小尺寸颜色等属性,在## position部分我们改变物体的位置(通常物体生成时默认几何中心和原点重合),在## Showing object部分我们定义各个物体的播放时序;

不一定非要分为这三个部分,不过代码比较多时最好自己有一个逻辑组织,你也可以按照物体来,把同一个物体相关的代码放一起或直接封装成一个新的函数在construct函数里面再调用即可;

在## Making object中我们建立了圆环、方形、矩形、直线等图形,常用的图形及其对应的名称如下(首字母一定要大写):圆(Circle),圆环(Annulus),椭圆(Ellipse),方形(Square),矩形(Rectangle),三角形(Triangle),多边形(Polygon)等,其实就是其对应的英文名;

颜色(color),内部填充的颜色(fill_color),不透明度(fill_opacity),高度(height),宽度(width)等属性自己试一下应该就明确了。注意这些都是小写,可缺省,也可用set_XXX来赋予该属性,如square.set_color(RED)就是给方形赋红色;

在## position中我们用shift方法移动了图形的位置,关于这部分的内容我们再下一列中展开讲解;

## Showing object中的代码之前很多都解释过了,其余的尝试一下应该就会了

运行manim后结果如下:

BasicShapes.py运行结果,用基本图形拼了一个滑轮的样子

在创建图形时,我们十分感谢图形本身的属性及其位置,因此在下个例子中我们弄一个简单的打靶练习来看看图形移动时位置是如何确定的。

实例二:打靶练习——掌握图形的位移

在例子开始前先把需要了解的几个点说明一下:

在刚才的滑轮例子中,我们用shift方法进行了图形初始位置的平移。shift方法本身接收一个向量作为输入变量,我们在shift方法中使用了DOWN、LEFT、RIGHT、UP等常量,这些常量同样在manimlib.constants中,其效果等效于将图形往对应方向移动一个单位,即DOWN为np.array([0,-1,0]),其余同理。所以向量np.array([1,2,0])其实等于UP*2+RIGHT;

所以在动画中一个单位究竟为多少呢,我们先感受一下:一个默认的圆(Circle)其半径为一个单位,默认的动画场景高度为8个单位;

除了shift方法外,改变图形(不止是图形,其他如TextMobject等Mobject也一样)位置的方法还有如:B.next_to(A, vector),使物体在vector(如np.array([1,2,0]),UP)定义的方向上挨着A;B.rotate(degree),让B旋转degree(弧度,如np.pi/2);

直接使用shift等方式改变的位置是没有动画的,如果要动画的话可以使用self.play(ApplyMethod(A.shift, vector))来实现A以向量vector进行移动的动画;

有了这些知识,我们可以编写一个打靶小练习来验证并巩固上述要点。下面为我们的python代码:

Shooting.py相关代码将shoot_ij函数打开后的后半部分代码

运行代码后,得到如下的结果:

运行manim后生成的打靶练习的动画

在这个例子中,我们绘制了一个3行5列的目标(target_ij),然后通过shoot_ij(i, j)来决定我们的瞄准镜锁定第i行j列的目标,击中目标时目标变灰并显示行列号(i, j都是从0开始的)。

结束语及下期预告

本来想再把公式的绘制、函数图像绘制及三维绘图等最基本的内容一起讲了的,不过时间貌似有点晚了,那这个这些就放在下次再讲吧。

我每次学习了一些东西后,总是会给自己定一个小目标用学到的东西去实现。我刚学manim一天是就用所学的最基本的东西做了一期视频:

这个视频都是用最基本的文字、形状和公式再加上常用的动画命令制作的,虽然还有很多瑕疵,但在完成这个小目标的过程也学到了不少。

那么,你如果了解了上面所讲的内容,不妨自己也练习一下。定一个自己跳一跳就能够得着的小目标,实现之后你会发现能学到不少。如果你不知道具体用我们上面讲的东西能做什么的话,你可以试试下图中的动画:

小练习——LoveDeath&Robots

这个本来也想作为基本形状部分的例子来讲的,也是因为时间原因,所以给出最终的动画大家有兴趣自己做一下。在下期的开头我会把这个例子的实现简单讲讲。

所以,下期我们主要讲一下这个小练习,以及数学公式,函数图像绘制、简单三维场景、简单向量场等内容。其实我也刚学manim不久,写这个专栏也算我近期定下的小目标,算是对自己所学的总结和分享,如果有什么不足和错误,欢迎批评指正。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭