【manim】之圆规动画

概要

前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。

manim 本身就是做动画的库,所以,基于它封装自定义的动画非常方便。

动画原理

对于单个的元素,manim本身就提供了非常多的动画函数。
比如:创建/消除的动画,移动元素的动画,旋转元素的动画等等,具体可以参考: Animations

如果是做一些简单的演示视频的话,这些内置的动画函数满足要求绰绰有余。
但是,对于多个元素联动的动画,则需要编写各个元素之间的联动规则,来封装符合要求的动画。

下面以圆规动画为例,演示多元素动画如何封装。

圆规动画目的还是画出一个 圆弧,只是在绘制的圆弧的过程中展示了圆弧的起点,终点以及连接起点终点之间的线。
这样,实际使用圆规作图的时候,可以更好的理解 圆弧是如何画出来的。

函数的签名如下:


def ruler(sc: Scene, p1, p2, angle=PI, axis=OUT):
    """
    圆规动画


    Parameters
    ---------
    sc
        绘制动画的场景
    p1
        代表圆规的针,绘制时不动的点
    p2
        代表圆规的笔芯,绘制圆弧的点
    angle
        绘制圆弧的角度,默认PI,相当于绘制半个圆
    axis
        只有2个值 IN/OUT,分别表示顺时针还是逆时针作弧
    """
    # 省略。。。
    return arc

各个参数的含义参见注释。

实现动画的思路如下:

  1. 构建3个元素,也就是d1(根据参数中p1坐标绘制的点),d2(根据参数中p2坐标绘制的点)以及 dl(连接p1和p2的虚线)
  2. 设置dl的动画,随着 d1d2变化不断重新绘制(这里 d1其实是不会变的)
  3. 再设置圆弧的动画,随着 d2的变动,不断绘制新的圆弧
  4. 通过 manim自带的动画函数让 d2先动,其他动画则会随之一起
  5. 最后删除不必要的元素,只保留圆弧在 场景(sc)中
def ruler(sc: Scene, p1, p2, angle=PI, axis=OUT):
    """
    圆规动画


    Parameters
    ---------
    sc
        绘制动画的场景
    p1
        代表圆规的针,绘制时不动的点
    p2
        代表圆规的笔芯,绘制圆弧的点
    angle
        绘制圆弧的角度,默认PI,相当于绘制半个圆
    axis
        只有2个值 IN/OUT,分别表示顺时针还是逆时针作弧
    """
    d1 = Dot(point=p1, color=RED)
    d2 = Dot(point=p2, color=GREEN)
    dl = DashedLine(d1.get_center(), d2.get_center())

    r = np.linalg.norm(p2 - p1)
    arc = ArcBetweenPoints(p2, p2)

    dl.add_updater(lambda z: z.become(DashedLine(d1.get_center(), d2.get_center())))
    if np.array_equal(axis, OUT):
        arc.add_updater(
            lambda z: z.become(
                ArcBetweenPoints(p2, d2.get_center(), radius=r, stroke_color=GREEN)
            )
        )
    if np.array_equal(axis, IN):
        arc.add_updater(
            lambda z: z.become(
                ArcBetweenPoints(d2.get_center(), p2, radius=r, stroke_color=GREEN)
            )
        )

    sc.add(d1, d2, dl, arc)
    sc.play(
        Rotate(
            d2,
            about_point=d1.get_center(),
            axis=axis,
            angle=angle,
            rate_func=linear,
        )
    )

    arc.clear_updaters()
    dl.clear_updaters()
    sc.remove(d1, d2, dl)
    return arc

动画效果

封装之后,使用起来非常简单:

# -*- coding: utf-8 -*-
from manim import *
import numpy as np


class Sample(Scene):
    def construct(self):
        ruler(self, np.array([-1, 0, 0]), np.array([-1, 1, 0]))
        ruler(self, np.array([1, 0, 0]), np.array([1, 1, 0]), axis=IN)
        self.wait()

上面演示了逆时针(默认是逆时针)和顺时针方式绘制半圆。
out.gif

各个元素的颜色等相关属性,没有暴露到函数参数中,可以直接在代码中修改。
这里主要演示如何基于 manim制作多元素动画的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【manim】之圆规动画 - Python技术站

(0)
上一篇 2023年3月31日
下一篇 2023年3月31日

相关文章

  • 【manim动画教程】–高级动画效果

    在常用的动画效果中,介绍了一些元素的创建,销毁,移动和变换的方法,这些方法都是针对单个动画的。如果需要多个动画互相关联,或者元素需要有更复杂的运动方式,那么,仅仅依靠常用的动画效果可能就无法满足要求了。 本篇的高级动画效果主要介绍一些更加灵活的元素运动方式,如何组合多个动画,以及如何联动多个动画的方式。掌握了这些方法,就能够表达出更加复杂的数学几何动画。 1…

    python 2023年4月17日
    00
  • 【manim】之目录动画

    概要 最近,结合视频剪辑工具剪映制作短视频时,如果不是数学相关的内容,使用视频剪辑工具配置字幕,添加图片等等比 manim更加方便。 所以,用 manim封装一个目录的动画,用来配合剪辑工具中的其他资源。 代码封装 基于manim封装一个目录显示的 class。主要属性就是 titles,也就是目录中的各个标题。 class CatalogDisplayer…

    Python开发 2023年3月31日
    00
  • 【manim动画教程】–目录(完结)

    manim是一个生成数学教学视频的动画引擎。它用编程的方式创建精美的数学动画,让数学更加易懂。 本教程简单介绍了 manim 的基本使用方式,基于 v0.17.2 版本 manim 安装 manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作数学视频用的,因为其友好的API和漂亮的UI效果,在开源之后,…

    python 2023年4月22日
    00
  • matplotlib可视化系列之【排版】

    排版虽然只是绘图中的辅助功能,但是好的排版能够提高图形的表现力。让人一眼看出图形要表达的内容和数据,而不用去费力的睁大眼睛去图中查找。 如果说 matplotlib的坐标系统,各种基础元素,包括柱状图,折线图,散点图等它的硬实力,那么,排版就是 matplotlib 的软实力,结合排版,能让分析结果给人一个良好的第一印象,增强别人对分析结果的信任。 排版是个…

    2023年4月2日
    00
  • 【manim】之滚动字幕

    概要 manim 是一个做数学视频的 python 库,这个库功能非常强大。具体可以参考官方介绍:https://github.com/ManimCommunity/manim/ 它本身只是封装数学相关的几何体和一些基础动画,所以,制作视频时,需要进一步封装更复杂的动画来满足视频的要求。最近做的一个视频有很多公式推导,所以封装了一个滚动字幕的组件。 代码封装…

    2023年4月2日
    00
  • 【pandas基础】–概述

    Pandas是一个开源的Python数据分析库。它提供了快速,灵活和富有表现力的数据结构,旨在使数据清洗和分析变得简单而快速。 Pandas是基于NumPy数组构建的,因此它在许多NumPy函数上提供了直接的支持。它还提供了用于对表格数据进行操作的数据结构,例如Series和DataFrame。 Pandas提供了许多用于数据操作和处理的函数和方法,例如数据…

    python 2023年5月2日
    00
  • matplotlib可视化系列之【颜色】

    颜色和排版一样,看似简单,其实非常复杂,往大了说,涉及到艺术和品味,不像数学公式,物理定理那样,是非分明。 但是,对 matplotlib 中的颜色有些基本的了解,可以让绘出的图形颜色不至于太突兀。虽不能说选出完美的颜色搭配,至少是看着舒服,醒目的颜色搭配。 颜色的种类 颜色一般用 RGB 来表示,颜色空间主要有3种: RGB sRGB Lab 3种颜色空间…

    2023年4月2日
    00
  • 【manim动画教程】– 文本样式

    文本的样式主要指颜色和字体相关的属性设置。 对于manim的两个文本对象 Text和 Tex来说,Text对象有更多的属性可以调整样式,相对来说,由于 Tex主要用来显示数学公式,所以关于样式的属性要少一些。 下面介绍一些我在视频制作时最常用的一些颜色和字体相关的属性。 1. 颜色相关 颜色设置主要分为单色,渐变色两种,对于 Text对象,manim还提供了…

    python 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部