查看原文
其他

Manim + ChatGPT 实践:零基础也能制作酷炫动画

思辨view kate人不错
2024-07-24

引言

我从博主@baibanbaonet处了解到Manim,进而了解到知名的3Blue1Brown频道使用的就是Manim这个动画软件。这个软件是由Grant Sanderson自己专门开发用于创建数学动画的。

https://github.com/3b1b/manim

Manim介绍

Manim是一个开源的Python库,用于制作数学动画。它可以帮助你创建高质量的动画,展示数学概念、方程和几何图形等。

Manim是个让我非常兴奋的工具,初次结识,就着迷使用了很久。

以下视频都是我用Manim做的。

视频1

视频2

视频3

视频4

视频5

Manim可制作的类型

Manim (Mathematical Animation Engine) 除了可以做数学公式相关的动画之外,还可以用来制作各种类型的动画。以下是一些例子:

  1. 几何图形动画:可以绘制和动画化各种几何图形,如多边形、圆形、椭圆、立方体等。
  2. 数据可视化:可以用来创建数据可视化动画,如条形图、饼图、折线图等。
  3. 物理模拟:可以用来模拟物理现象,如抛物运动、波动现象、电磁场等。
  4. 算法演示:可以用来演示各种算法的运行过程,如排序算法、搜索算法、图论算法等。
  5. 文本动画:可以创建文本动画,如标题动画、字幕动画、渐显渐隐效果等。
  6. 三维动画:可以创建和动画化三维对象和场景,进行三维视角的变换和旋转。
  7. 自定义动画:可以通过编写自定义的动画类和方法,制作各种特效和动画场景。

Manim 安装指南

为什么有不同版本的 Manim?

Manim 最初由 Grant Sanderson 创建,用于他的 YouTube 频道 3Blue1Brown。随着频道的受欢迎程度增加,许多人想使用 Manim 来制作自己的项目。然而,最初的 Manim 仅供个人使用,其他用户很难安装和使用。

版本历史

  • 2019 年底: Grant 开始在一个新分支(Shaders 分支)上工作,以实现更快的 OpenGL 渲染。
  • 2020 年中: 一组开发者将其分叉成现在的社区版(ManimCE)。
  • 2021 年初: Grant 将 Shaders 分支合并回主分支,形成了 ManimGL。

各版本介绍

  • Manim (ManimCE): 由社区维护的版本,是文档所在的版本,PyPI 包名为 manim
  • ManimGL: 由 Grant Sanderson 维护的最新版本,具有更多实验性功能,PyPI 包名为 manimgl
  • ManimCairo: OpenGL 渲染前的旧版本,仅用于渲染 Grant 的旧视频,PyPI 包名为 manimlib

应该使用哪个版本?

推荐: 对初学者推荐使用社区版(ManimCE),更稳定,文档完善,社区响应快速。

https://docs.manim.community/en/stable/installation/macos.html

Manim社区文档里安装指南很详细,这里只展示Mac电脑安装。

macOS安装Manim指南

前提条件

假设你已经安装了流行的软件包管理器 Homebrew。如果尚未安装,请按照Homebrew的安装指南进行操作。

必需依赖项

安装所有必需依赖项

运行以下命令安装 Manim 所需的所有依赖项(即:ffmpeg、Python 以及一些必要的 Python 包):

brew install py3cairo ffmpeg

Apple Silicon 处理器额外依赖

对于基于 Apple Silicon 的设备(例如,带有 M1 芯片的设备),需要额外安装以下依赖项:

brew install pango pkg-config scipy

安装 Manim

在所有必需依赖项安装完成后,运行以下命令安装 Manim:

pip3 install manim

可选依赖项

若要使用 Manim 的 LaTeX 接口(例如渲染方程),需要安装 LaTeX。官方说明这是一个可选依赖项,如果你不打算使用 LaTeX,则不必安装。

为了充分探索Manim的魅力,我建议安装LaTeX。

安装 LaTeX

对于 macOS,推荐的 LaTeX 发行版是 MacTeX。你可以按照链接中的说明进行安装,也可以通过 Homebrew 安装:

brew install --cask mactex-no-gui

📢注意:

MacTeX 是一个完整的 LaTeX 发行版,需要超过 4GB 的磁盘空间。如果这是个问题,考虑安装较小的发行版如 BasicTeX。

我的笔记本在尝试安装完整的LaTeX发行版时未成功,于是我改为安装了BasicTeX这个较小的发行版。

在安装过程中,你可能会遇到一些问题,不要着急,直接把报错发给GPT或Claude,一步步解决就好。

安装好后,你就可以试下以下代码,运行你的第一个Manim动画了。

一个圆圈的动画

打开一个文本编辑器,例如记事本。

from manim import *
class CreateCircle(Scene):
    def construct(self):
        circle = Circle()  # 创建一个圆圈
        circle.set_fill(PINK, opacity=0.5)  # 设置颜色和透明度
        self.play(Create(circle))  # 在屏幕上显示圆圈

将代码片段保存到你的项目文件夹中,命名为 scene.py

project/
└─scene.py

打开命令行,导航到你的项目文件夹,并执行以下命令:

manim -pql scene.py CreateCircle

生成效果如下:

分享我使用Manim的体验

视频1

这里是一个使用 Manim 创建文本动画的示例,用于展示 AI 发展的历史。

首先,创建一个名为 ai_history.py 的文件,并将以下代码粘贴到文件中:

from manim import *

class AIHistory(Scene):
    def construct(self):
        # Define the history events
        history = [
            "1956: The term 'Artificial Intelligence' is coined at the Dartmouth Conference.",
            "1966: ELIZA, an early natural language processing computer program, is created.",
            "1980: The first AI winter begins, a period of reduced funding and interest in AI research.",
            "1997: IBM's Deep Blue defeats world chess champion Garry Kasparov.",
            "2011: IBM's Watson wins Jeopardy! against human champions.",
            "2016: Google's AlphaGo defeats world champion Go player Lee Sedol.",
            "2020: OpenAI's GPT-3, a powerful language model, is released."
        ]

        # Create a title
        title = Text("AI Development History").scale(1.2)
        self.play(FadeIn(title))
        self.wait(1)
        self.play(title.animate.to_edge(UP))

        # Animate each history event
        for event in history:
            event_text = Text(event, font_size=24)
            self.play(FadeIn(event_text))
            self.wait(2)
            self.play(FadeOut(event_text))

        # End with a thank you message
        thank_you = Text("Thank you for watching!").scale(1.2)
        self.play(FadeIn(thank_you))
        self.wait(2)

if __name__ == "__main__":
    from manim import *
    scene = AIHistory()
    scene.render()

保存文件后,可以使用以下命令在终端中运行该文件,生成动画:

manim -pql ai_history.py AIHistory

这段代码实现了以下功能:

  1. 定义了一些 AI 发展历史上的关键事件。
  2. 创建了一个标题 "AI Development History",并将其显示在屏幕顶部。
  3. 逐条显示历史事件,每条事件显示 2 秒后淡出。
  4. 结束时显示感谢信息 "Thank you for watching!"。

每个历史事件都是通过 FadeInFadeOut 动画效果来显示和消失的。这种方式可以让观众逐步看到每个事件,从而更好地了解 AI 的发展历史。

视频2

神经网络图,我是参考推文的图片让GPT生成的Manim代码。

视频3

这是我让GPT帮我写的,给它的参考图片是我用html排版的,我将其中的美人鱼换成了表情包SVG。

在GPT生成代码后和它继续交流改进。

项目代码:

from manim import *
import random

class EmojiPattern(Scene):
    def construct(self):
        # 设置背景颜色
        self.camera.background_color = "#faf7f0"

        # 加载SVG文件
        svg_path = "emoji-wink-svgrepo-com.svg"
        emoji = SVGMobject(svg_path).scale(0.5)

        # 定义颜色列表
        colors = [RED, ORANGE, YELLOW, GREEN, TEAL, BLUE, PURPLE]

        # 创建5x5的emoji网格,并赋予随机颜色和移动
        rows = 5
        cols = 5
        x_spacing = 1.5
        y_spacing = 1.5

        emojis = []
        for i in range(rows):
            for j in range(cols):
                emoji_copy = emoji.copy()
                emoji_copy.set_color(random.choice(colors))
                emoji_copy.move_to((j * x_spacing - 3, i * y_spacing - 30))
                emojis.append(emoji_copy)
                self.add(emoji_copy)

        # 添加底部文本
        text = Text("Dragon Boat Festival", font_size=24).to_edge(DOWN)
        self.add(text)

        # 让emoji随机移动并变化颜色,持续30秒
        for _ in range(30):
            self.play(
                *[ApplyMethod(emoji.shift, np.random.uniform(-0.50.53)) for emoji in emojis],
                *[ApplyMethod(emoji.set_color, random.choice(colors)) for emoji in emojis],
                run_time=1, rate_func=there_and_back
            )

        # 暂停以查看最终场景
        self.wait(2)

if __name__ == "__main__":
    from manim import config, tempconfig
    config.background_color = "#faf7f0"  # 背景色
    EmojiPattern().render()

将此代码保存为emoji_pattern.py,然后在命令行中运行以下命令来生成视频:

manim -pql emoji_pattern.py EmojiPattern

最后,介绍下Manim如何设置生成的视频分辨率。

Manim可以生成多种分辨率的视频:

  • 480p (SD)
  • 720p (HD)
  • 1080p (Full HD)
  • 1440p (2K)
  • 2160p (4K)

你可以通过在命令行中使用 -r 选项来指定输出视频的分辨率。以下是不同分辨率的视频生成命令示例:

  1. 生成 480p 分辨率的视频:

    manim -pql -r 854,480 pillow_example.py
  2. 生成 720p 分辨率的视频:

    manim -pql -r 1280,720 pillow_example.py
  3. 生成 1080p 分辨率的视频:

    manim -pql -r 1920,1080 pillow_example.py
  4. 生成 1440p 分辨率的视频:

    manim -pql -r 2560,1440 pillow_example.py
  5. 生成 2160p (4K) 分辨率的视频:

    manim -pql -r 3840,2160 pillow_example.py

其中,-pql 参数用于快速渲染和低质量预览。如果你希望高质量渲染,可以将 -pql 替换为 -pqh。例如,生成 1080p 高质量视频的命令为:

manim -pqh -r 1920,1080 pillow_example.py

结语

后续我会与大家分享更多关于使用Manim的心得体会。

实践过程中,Claude有时生成的Manim代码视频渲染不错,推荐大家可以多尝试不同LLM。

欢迎在评论区留言,让我们一起交流进步。

精选历史文章,请看这里:

轻松构建你的第一个 AI 项目:使用 Replit 和热门 API 搭建你的应用

Google 新推出 AI 辅助工具,Data Science Agent 和 Code Transformation 值得一试

用 Marp 让 Markdown+AI 快速制作 PPT,让你的演示更出彩

你还在手动排版公众号文章?看看 ChatGPT 怎么轻松搞定 | PPT、MD、CSV 批量转公众号排版

推荐一个自动生成复杂提示词的模版:思考链(CoT)如何通过分步推理提升AI任务准确性 | 示例详解

继续滑动看下一个
kate人不错
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存