manimce社区版安装与基本的使用方法,manim版本介绍,manim、FFmpeg、texlive怎么安装
自从3blue1brown的视频在油管和B站上被越来越多的人知晓后,grant本人也开源了他用来制作视频的python第三方库——manim,随之一批精准科学动画制作爱好者开始了对manim的研究和改进,在这两年中,manim 的 Github 项目发生了很大的变化,并衍生出了三个主要版本,分别是 manimCairo、manimGL、manimCE。
1、manim版本介绍
- manimCairo:manim 的早期版本,该版本自 2020 年 11 月起已经停止了更新维护。
- manimGL:该版本由 3B1B 作者 Grant Sanderson 主要负责维护。该版本由早期版本更新迭代而来,之所以这样命名,是因为该版本支持 OpenGL 的渲染。按照墨西哥知名 manim 教学 up 主 Theorem of Beethoven 的说法,该版本已近趋于稳定,但还尚未完成[1]。
- manimCE:为本篇主要介绍的版本,该版本是由 2020 年中旬的一个 manim 分支演化而来,该分支后来社区化,被称为是 manim Community Edition ,缩写为 manimCE。现在该版本被一群开发者共同更新维护,原作者 Grant Sanderson 也在其中。这是 manim 当前的一个最为稳定的版本,相对于早期版本,其在语法结构上做了大量优化,并简化了安装步骤。由于参与者更多,所以其更新维护最为频繁,一些常见的 BUG 能在较短的时间内被解决,所以更加适合新手上手(注意:以往的教程并不适用于该版本) 。
怎么判断你的代码是哪个版本的:
from manim import * # manimCE 版
from manimlib import * # manimCairo 版
from manimgl import * # manimGL 版
2、manim社区版地址:
3、manimCE 结构 site-packages\manim
│ communitycolors.py # manim社区的彩色地图
│ constants.py # 常量定义文件
│ __init__.py
│ __main__.py
│
├───animation
│ │ animation.py # 动画的基类
│ │ changing.py # 移动对象边界动画和点跟踪
│ │ composition.py # 用于同时显示多个动画的工具
│ │ creation.py # 为场景中移动对象的显示或移除设置动画
│ │ fading.py # 淡入淡出视线
│ │ growing.py # 通过从点开始增长将移动对象引入场景的动画
│ │ indication.py # 一些用于强调的动画
│ │ movement.py # 和移动有关的动画
│ │ numbers.py # 实现对 DecimalNumber 数字的变化
│ │ rotation.py # 和旋转有关的动画
│ │ specialized.py # 一些针对特殊项目的不常用动画
│ │ transform.py # 一些 Transform 变换
│ │ transform_matching_parts.py # 自动匹配部分的 Transform
│ │ __init__.py
│ │
│ └───updaters # 与更新功能相关的动画和实用程序对象
│ mobject_update_utils.py # 用于移动对象连续动画的实用函数
│ update.py # 更新移动对象的动画
│ __init__.py
│
├───camera # 相机
│ camera.py # 摄像机将场景中包含的移动对象转换为像素阵列
│ mapping_camera.py # 允许对象之间映射的相机
│ moving_camera.py # 能够在场景中移动的摄像机
│ multi_camera.py # 支持多视角的相机
│ three_d_camera.py # 可以在三维空间中定位和定向的摄像机
│ __init__.py
│
├───cli
│ │ __init__.py
│ │
│ │ default_group.py # DefaultGroup允许子命令充当主命令
│ │
│ ├───cfg
│ │ group.py # Manim的cfg子命令
│ │ __init__.py
│ │
│ ├───init
│ │ commands.py # Manim的init子命令
│ │ __init__.py
│ │
│ ├───new
│ │ group.py
│ │ __init__.py
│ │
│ ├───plugins
│ │ commands.py # Manim的插件子命令
│ │ __init__.py
│ │
│ └───render
│ commands.py
│ ease_of_access_options.py
│ global_options.py
│ output_options.py
│ render_options.py
│ __init__.py
│
├───grpc
│ │ __init__.py
│ │
│ ├───gen
│ │ frameserver_pb2.py
│ │ frameserver_pb2_grpc.py
│ │ renderserver_pb2.py
│ │ renderserver_pb2_grpc.py
│ │ __init__.py
│ │
│ ├───impl
│ │ frame_server_impl.py
│ │ __init__.py
│ │
│ └───proto
│ frameserver.proto
│ renderserver.proto
│
├───gui
│ gui.py
│ __init__.py
│
├───mobject
│ │ frame.py # 和 frame 有关的 mobject
│ │ graph.py # 用于表示数学图的对象(图论,而不是绘图)
│ │ logo.py # Manim logo
│ │ matrix.py # 矩阵
│ │ mobject.py # 所有mobject的父类
│ │ table.py # 表的mobject
│ │ value_tracker.py # ValueTracker(存储数的 mobject)
│ │ vector_field.py # 向量场
│ │ __init__.py
│ │
│ ├───geometry # 几何图形的 mobject
│ │ arc.py # 弯曲的对象
│ │ boolean_ops.py # 二维mobject的布尔运算
│ │ line.py # 线条或其变体的移动对象
│ │ polygram.py # 是简单几何形状的对象
│ │ shape_matchers.py # 用于标记和注释其他移动对象的移动对象
│ │ tips.py # 提示对象
│ │ __init__.py
│ │
│ ├───graphing
│ │ coordinate_systems.py # 表示坐标系的移动对象
│ │ functions.py # 表示函数图的mobject
│ │ number_line.py # 数轴
│ │ probability.py # 和概率有关的 mobject
│ │ scale.py
│ │ __init__.py
│ │
│ ├───opengl
│ │ dot_cloud.py # Dot cloud (PMobject 的一个子类)
│ │ opengl_compatibility.py
│ │ opengl_geometry.py
│ │ opengl_mobject.py
│ │ opengl_point_cloud_mobject.py
│ │ opengl_surface.py
│ │ opengl_three_dimensions.py
│ │ opengl_vectorized_mobject.py
│ │ __init__.py
│ │
│ ├───svg
│ │ brace.py
│ │ style_utils.py
│ │ svg_mobject.py
│ │ svg_path.py
│ │ __init__.py
│ │
│ ├───text
│ │ code_mobject.py # 代码的 mobject
│ │ numbers.py # 数字的 mobject
│ │ text_mobject.py # 文本的 mobject
│ │ tex_mobject.py # LaTeX的 mobject
│ │ __init__.py
│ │
│ ├───three_d
│ │ polyhedra.py # 一般多面体类与柏拉图体
│ │ three_dimensions.py # 三维物体
│ │ three_d_utils.py # 三维物体的一般多面体类和柏拉图固结函数
│ │ __init__.py
│ │
│ └───types
│ image_mobject.py
│ point_cloud_mobject.py # PMobject (点集构成的 mobject)
│ vectorized_mobject.py
│ __init__.py
│
├───opengl
│ __init__.py
│
├───plugins
│ import_plugins.py
│ plugins_flags.py
│ __init__.py
│
├───renderer
│ │ cairo_renderer.py
│ │ opengl_renderer.py
│ │ opengl_renderer_window.py
│ │ shader.py
│ │ shader_wrapper.py
│ │ vectorized_mobject_rendering.py
│ │ webgl_renderer.py
│ │ __init__.py
│ │
│ └───shaders # 渲染中使用的GLSL脚本
│ │ design.frag
│ │ design_2.frag
│ │ design_3.frag
│ │ simple_vert.glsl # 一个简单的对位置的 glsl 脚本
│ │
│ ├───default
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───image # 针对图像的 glsl
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───include
│ │ add_light.glsl
│ │ camera_uniform_declarations.glsl
│ │ finalize_color.glsl
│ │ get_gl_Position.glsl
│ │ get_rotated_surface_unit_normal_vector.glsl
│ │ get_unit_normal.glsl
│ │ NOTE.md
│ │ position_point_into_frame.glsl
│ │ quadratic_bezier_distance.glsl
│ │ quadratic_bezier_geometry_functions.glsl
│ │
│ ├───manim_coords
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───quadratic_bezier_fill # 针对二阶贝塞尔填充的 glsl
│ │ frag.glsl
│ │ geom.glsl
│ │ vert.glsl
│ │
│ ├───quadratic_bezier_stroke # 针对二阶贝塞尔线条的g lsl
│ │ frag.glsl
│ │ geom.glsl
│ │ vert.glsl
│ │
│ ├───surface # 针对三维面的 glsl
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───test
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───textured_surface# 针对纹理面的 glsl
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───true_dot # 对于一个点的 glsl
│ │ frag.glsl
│ │ geom.glsl
│ │ vert.glsl
│ │
│ ├───vectorized_mobject_fill
│ │ frag.glsl
│ │ vert.glsl
│ │
│ ├───vectorized_mobject_stroke
│ │ frag.glsl
│ │ vert.glsl
│ │
│ └───vertex_colors
│ frag.glsl
│ vert.glsl
│
├───scene # 场景
│ moving_camera_scene.py
│ scene.py # 最普通的场景
│ scene_file_writer.py # 用于将 scene 写入视频文件
│ section.py # 分段视频API的构建块
│ three_d_scene.py # 三维场景
│ vector_space_scene.py # 向量场场景
│ zoomed_scene.py # 支持在指定区域放大的场景
│ __init__.py
│
├───templates
│ Axes.mtp
│ Default.mtp
│ MovingCamera.mtp
│ template.cfg
│
└───utils # 一些实用的工具函数
│ bezier.py # 贝塞尔曲线
│ caching.py
│ color.py # 颜色
│ commands.py
│ config_ops.py # 处理 CONFIG
│ debug.py # 在程序中 debug 的函数
│ deprecation.py # 用于弃用类、函数和函数参数的修饰符
│ exceptions.py
│ family.py
│ family_ops.py # 处理 family 成员
│ file_ops.py # 处理文件目录
│ hashing.py
│ images.py # 读取图片
│ ipython_magic.py
│ iterables.py
│ module_ops.py
│ opengl.py
│ paths.py # 路径
│ rate_functions.py # 一些定义的 rate_function
│ simple_functions.py # 一些常用函数
│ sounds.py # 处理声音
│ space_ops.py # 空间坐标计算
│ tex.py
│ tex_file_writing.py # 将字符串利用 LaTeX 写成 svg
│ tex_templates.py
│ unit.py
│ __init__.py
│
├───docbuild
│ manim_directive.py
│
└───testing
config_graphical_tests_monoframe.cfg
config_graphical_tests_multiframes.cfg
frames_comparison.py
_frames_testers.py
_show_diff.py
_test_class_makers.py
__init__.py
4、manimce的安装
与原版的manim相比,社区版的manimce好安装很多,只需要一行命令:
pip install manim
manim内部的视频渲染还是视频渲染界的通用工具ffmpeg,这也是作为博主的我超喜欢的一个命令行工具,下载地址:
下载完后请将bin文件夹路径(也就是ffmpeg.exe可执行文件所在的文件夹路径)加入环境变量中,然后如果打开你美丽的命令行,输入“ffmpeg -version”,看看是不是正常输出了版本信息:
只要没出现红色的无法识别信息,就说明你的ffmpeg安装完了。
我们看到很多Manim的视频中有排版好看的数学公式,为了渲染数学工具,我们需要下载21世纪大学生都要会玩的小工具——latex通用排版语言,你可以安装小巧的Miktex,但是了为了后续的TexText排版中的各种问题,此处强烈推荐安装完整版的texlive。
TeX Live 2022,下载地址:
TeX Live 2022 安装指南【安装 LaTeX,建议安装到非系统盘】
5、一个简单的实例
打开你喜欢的代码编辑器,创建一个start.py文件,内容如下:
from manim import *
class SquareToCircle(Scene): # 渲染的基本对象都是Scene类的子类
def construct(self): # construct中则会定义渲染出来的视频有什么基本对象,这些对象的动作行为又是什么
circle = Circle() # 创建一个圆形
circle.set_fill(BLUE, opacity=0.5) # 填充为蓝色,透明度0.5
circle.set_stroke(BLUE_E, width=4) # 设置轮廓线条颜色BLUE_E,宽度为4
square = Square() # 创建一个方形
square.set_stroke(WHITE, width=4) # 设置轮廓线条颜色WHITE,宽度为4
self.play(Create(square)) # 执行创建方形的动画
self.wait() # 默认等待1秒
self.play(ReplacementTransform(square, circle)) # 将方形转换为圆形
self.wait(2) # 等待2秒
if __name__ == '__main__':
from os import system
# p代表执行完播放,ql画面质量低,qh画面质量中等,qk画面质量高清
manim_cli = "manim -pql {} SquareToCircle".format(__file__)
system(manim_cli)
右键选择运行,代码执行完后就能看到播放的动画效果
相信这篇文章能够给你带来一些有关manim的感性认识,如果你对计算机底层技术不感兴趣,没事,你就当我之前讲了一般废话。
接下来,我会出一套关于manim较为系统的文章,也会穿插写写关于源代码的内容,另外也会使用Manim自动生成一套Manim的视频教程,感兴趣的同学可以看下我知乎专栏里面:Manin视频介绍,视频里面的画面、语音、字幕都是自动生成的,画面、语音、字幕也实现了自动对齐播放,希望文章和视频教程能帮助到你,记得收藏本站,谢谢支持!
参考
- ^manim 的版本比较 https://www.youtube.com/watch?v=Upztg_Bs-zs