Manim v0.19.1 发布啦!三大新特性让动画制作更丝滑

大家好!Manim 社区刚刚发布了 v0.19.1 版本(发布于 12 月 1 日)。虽然这是一个小版本号更新,但里面可是藏着几个非常实用的新功能!

无论你是刚入坑的新手,或者已经被某些痛点折磨过的老手,这篇更新速览都值得一看。

1. 🌟 亮点一:终于可以“固定”随机颜色了!

以前我们在使用 random_color() 时,最大的痛点就是:每次运行脚本,生成的颜色都不一样!
有时候你觉得这次随机出来的配色方案简直完美,结果改了一行无关代码再渲染,配色变了……心态直接崩了有没有?

v0.19.1 中,random_color() 终于支持 seed(随机种子)参数了!这意味着你可以通过指定种子,让随机颜色变得“确定”。

🌰 代码示例

from manim import *


class DeterministicColors(Scene):
    def construct(self):
        # 以前:每次运行颜色都可能不同
        # circle = Circle(color=random_color())

        # 现在:指定 seed=1,无论运行多少次,它永远是同一个颜色!
        rnd = RandomColorGenerator(seed=1)
        dot_a = Dot(radius=1, color=rnd.next())
        dot_a.shift(LEFT * 2)

        # 即使在不同的地方调用,只要种子一样,颜色就一样
        dot_b = Dot(radius=1, color=rnd.next())
        dot_b.shift(RIGHT * 2)

        self.play(Create(dot_a), Create(dot_b))
        self.wait()

只要seed的值一样,每次的随机的颜色都一样。

这对于制作系列视频或者调试配色时简直是救命稻草。

2. 🌟 亮点二:ValueTracker 终于学会算术了

ValueTracker 是 Manim 中做动态数值动画的核心。但以前它有点“笨”,不能直接参与加减乘除。

比如你想让一个 tracker 的值翻倍,以前你得写 t.set_value(t.get_value() * 2)

现在则直接乘这就行了!

新版本支持 +, -, *, /, //, %, ** 等常见运算符。

🌰 代码示例

from manim import *

class SmartTracker(Scene):
    def construct(self):
        tracker = ValueTracker(2)

        number = DecimalNumber()
        number.add_updater(lambda m: m.set_value(tracker.get_value()))

        self.add(number)

        # 以前的写法(现在依然可用,但比较繁琐)
        # self.play(tracker.animate.set_value(tracker.get_value() + 5))

        # v0.19.1 的新玩法:直接对对象进行操作
        # 注意:这里展示的是逻辑上的简化,在非 animate 场景下处理数据更方便

        # 比如我们在循环中处理数据逻辑时:
        tracker += 5  # tracker 的内部值现在变成了 7
        self.wait()

        # 甚至可以进行更复杂的运算
        tracker *= 2  # 变成 14
        self.wait()

        # 注意:如果你要用 animate 动画过渡,还是推荐用 .animate.set_value()
        # 但这个特性让编写复杂的 updater 逻辑或者预计算变得非常爽。

代码又可以少写几行 get_value() 了,清爽度 +1。

3. 🌟 亮点三:新增 TangentialArc (切线弧)

这是几何绘图的新玩具!以前如果想画一段圆弧,既要连接两个点,又要保证切线方向平滑,可能需要费点脑筋去算角度。

新的 TangentialArc 旨在简化这类几何构造。

目前官方文档还在完善中,但它的出现意味着我们可以更容易地画出流畅连接直线或曲线的圆弧了。

🌰 代码场景

如果你有一条直线,想在末端接一个圆弧,且连接处要是“丝滑”的(切线连续)。

以前你得算切角,现在可以试试使用 TangentialArc

class TangentialArcSample(Scene):
    def construct(self):
        l1 = Line([0, 3, 0], [1, 2, 0], color=RED)
        l2 = Line([-2, 3, 0], [1, 2, 0], color=BLUE)

        # 创建切圆弧对象
        # 参数说明:
        # - l1: 第一条切线
        # - l2: 第二条切线
        # - radius: 圆弧的半径(0.2)
        # - corner: 圆弧所在的角落方向
        # - color: 圆弧的颜色(绿色)
        circulararc = TangentialArc(l1, l2, radius=0.2, corner=(-1, -1), color=GREEN)
        self.play(Create(l1), Create(l2))
        self.play(Create(circulararc))

        self.wait()

4. 🛠️ 其他值得关注的变化

除了上面三个新特性,还有一些改动也非常贴心:

  1. SurroundingRectangle 更灵活了
    以前 buff 参数只能是一个数字,导致矩形框的四周留白必须一样。现在你可以传入一个元组 buff=(0.5, 0.1),分别控制 水平垂直 方向的间距。给长公式加框时再也不用担心左右太宽或者上下太挤了!
  2. Code Mobject 支持 OpenGL
    如果你是用 OpenGL 渲染模式(渲染速度超快的那种)的用户,现在 Code 对象也能完美显示了。
  3. 修复了 Tex 环境格式化问题
    LaTeX 公式时如果不小心换行或者格式乱了,现在 Manim 能更好地处理它,报错更少。
  4. CLI 默认分辨率调整
    命令行工具的默认分辨率逻辑进行了一些微调,更加符合 1080p 的标准预期。

5. 📝 总结与升级

这次 v0.19.1 虽然版本号跨度不大,但每一个改动都切中了实际开发中的痛点。

特别是 随机种子ValueTracker 算术支持,属于那种“用了就回不去”的优化。

升级Manim也很简单,打开终端/命令行,输入:

pip install --upgrade manim

快去试试新功能吧!如果你用新特性做出了好玩的动画,欢迎在社区分享哦。

posted @ 2025-12-02 12:29  wang_yb  阅读(147)  评论(0)    收藏  举报