羽玲 發表於 2026-2-21 17:34:00

🚀 Manim CE v0.20.0 发布:动画构建更丝滑,随机性终于“可控”了!

<p>大家新年好!<code>Manim Community Edition</code> (CE) 刚刚发布了里程碑式的 <strong>v0.20.0</strong> 版本。</p>
<p>如果你觉得以前写 <code>updater</code>(更新程序)太啰嗦,或者每次渲染随机场景结果都不一样让你抓狂,那么这次更新绝对是为你准备的!</p>
<p>本次更新不仅重构了核心组件,还带来了一些超甜的“语法糖”。</p>
<p>下面我们来看看这次升级的亮点,以及它们如何改变你的编码方式。</p>
<h1 id="-亮点一mobjectalways--告别繁琐的-lambda">✨ 亮点一:<code>Mobject.always</code> —— 告别繁琐的 Lambda</h1>
<p>在制作动画时,我们经常需要让一个物体“永远”跟随另一个物体(比如标签永远在点的上方)。</p>
<p>以前,你需要使用 <code>add_updater</code> 配合 <code>lambda</code> 函数,代码看起来又长又乱。</p>
<p><code>v0.20.0</code> 引入了神奇的 <code>.always</code> 属性,让这一切变得符合直觉。</p>
<h2 id="-对比示例让标签跟随方块">🆚 对比示例:让标签跟随方块</h2>
<p>❌ <strong>以前的写法 (v0.19.x 及之前):</strong><br>
你需要显式地添加一个更新函数,或者写一个 lambda 表达式。</p>
<pre><code class="language-python">s = Square()
label = Text("我在这里")

# 你必须这样写:
label.add_updater(lambda m: m.next_to(s, UP))

# 或者这样写:
def update_label(m):
    m.next_to(s, UP)
label.add_updater(update_label)
</code></pre>
<p>✅ <strong>现在的写法 (v0.20.0):</strong><br>
直接用 <code>always</code>,像说话一样自然!</p>
<pre><code class="language-python">s = Square()
label = Text("我在这里")

# 新语法:永远.紧挨着(方块, 上方)
label.always.next_to(s, UP)
</code></pre>
<p>💡 <strong>为什么好用?</strong> 这不仅减少了代码量,还让代码的可读性大幅提升。</p>
<h1 id="-亮点二可复现的随机性">🎲 亮点二:可复现的随机性</h1>
<p>对于制作数学或科学视频的人来说,"随机"有时候是个麻烦。</p>
<p>你想展示 10 个随机点,但你不希望每次重新渲染视频时,这 10 个点的位置都变了。</p>
<p><code>v0.20.0</code> 终于引入了正式的 <strong>Seed(种子)配置</strong>。</p>
<h2 id="-对比示例生成随机点">🆚 对比示例:生成随机点</h2>
<p>❌ <strong>以前的情况:</strong><br>
每次运行 <code>manim render</code>,随机生成的位置都会变化(除非你自己手动在 Python 脚本里 hack <code>random.seed</code>)。</p>
<p>✅ <strong>现在的情况:</strong><br>
你可以通过配置文件或命令行参数锁定“运气”。</p>
<p><strong>方式 1:命令行参数</strong></p>
<pre><code class="language-bash"># 只要种子是 42,生成的画面永远一模一样
manim -pql scene.py MyScene --seed 42
</code></pre>
<p><strong>方式 2:代码内配置</strong></p>
<pre><code class="language-python">from manim import *

config.seed = 123# 在脚本开头锁定种子

class RandomDemo(Scene):
    def construct(self):
      # 无论运行多少次,这个圆的位置都是固定的
      dot = Dot(point=)
      self.add(dot)
</code></pre>
<h1 id="-亮点三mathtex-重构与更强的子结构控制">📐 亮点三:MathTex 重构与更强的子结构控制</h1>
<p>公式是 <code>Manim</code> 的灵魂。<code>v0.20.0</code> 重写了 <code>MathTex</code> 的底层逻辑。</p>
<p>现在的 <code>MathTex</code> 在处理 <code>LaTeX</code> 拆分时更加健壮,而且能够利用 <code>SVG</code> 的“命名组”特性。</p>
<p>这意味着,当你把公式拆分成不同部分进行着色或变换时,出错的概率大大降低了。</p>
<h2 id="-示例精准控制公式颜色">🔧 示例:精准控制公式颜色</h2>
<pre><code class="language-python">class MathUpdate(Scene):
    def construct(self):
      # 使用 {{ }} 将想要独立操作的字符包裹起来
      # Manim 会自动把这些部分分离成独立的子对象(submobjects)
      equation = MathTex(r"{{a}}^2 + {{b}}^2 = {{c}}^2")

      # 现在 "a" 是独立的,染色不会影响 "^2"
      equation.set_color_by_tex("a", BLUE)
      equation.set_color_by_tex("b", GREEN)
      equation.set_color_by_tex("c", RED)

      self.add(equation)
      self.wait(1)
</code></pre>

<p><img src="https://img2024.cnblogs.com/blog/83005/202602/83005-20260221173344909-1843335371.png" alt="" loading="lazy"></p>
<h1 id="️-注意破坏性变更与修复">⚠️ 注意:破坏性变更与修复</h1>
<p>升级前,请留意以下变化,你的老代码可能需要微调:</p>
<ol>
<li><strong>ImageMobject 的修复</strong>:如果你以前对图片进行了 3D 旋转或翻转,可能会发现行为变了——因为以前是错的,现在修好了!同时,移除了一些不常用的重采样算法参数(如 <code>lanczos</code>)。</li>
<li><strong>新颜色常量</strong>:如果你是设计强迫症,现在可以使用 <code>PURE_CYAN</code>(纯青)、<code>PURE_MAGENTA</code>(纯洋红)和 <code>PURE_YELLOW</code>(纯黄)。</li>
<li><strong>Table 修复</strong>:修复了高亮表格单元格时可能导致的无限递归崩溃问题。</li>
</ol>
<h1 id="-技术债务清理">🔧 技术债务清理</h1>
<h2 id="1-减少对-scipy-的依赖">1. 减少对 SciPy 的依赖</h2>
<p>用 Python 标准库的 <code>math.comb</code> 替代了 <code>scipy.special.comb</code>,减少了外部依赖,让安装更轻量。</p>
<h2 id="2-类型提示系统完善">2. 类型提示系统完善</h2>
<p>为多个核心模块添加了类型注解:</p>
<ul>
<li><code>rotation.py</code></li>
<li><code>image_mobject.py</code></li>
<li><code>opengl_renderer.py</code></li>
<li><code>point_cloud_mobject.py</code></li>
</ul>
<p>这对于使用 IDE 进行开发的用户来说是个好消息,可以获得更好的代码补全和类型检查支持。</p>
<h2 id="3-移除未来导入要求">3. 移除未来导入要求</h2>
<p>不再强制要求 <code>from __future__ import annotations</code>,简化了代码编写。</p>
<h1 id="-文档改进">📚 文档改进</h1>
<ol>
<li>完善了 <code>RandomColorGenerator</code> 的文档</li>
<li>改进了 <code>TransformFromCopy</code> 的文档字符串</li>
<li>修复了损坏的外部链接</li>
<li>更新了 Python 版本要求文档</li>
</ol>
<h1 id="-如何升级">📦 如何升级?</h1>
<p>准备好体验新功能了吗?打开终端,运行:</p>
<pre><code class="language-bash">pip install --upgrade manim
</code></pre>
<p>或者如果你使用 conda:</p>
<pre><code class="language-bash">conda update manim
</code></pre>
<p>快去试试那个超酷的 <code>.always</code> 属性吧!</p>
<h1 id="-总结">💡 总结</h1>
<p><code>manimCE v0.20.0</code> 是一个注重稳定性和开发体验的版本。虽然有一些破坏性变更,但带来的改进是值得的:</p>
<ul>
<li>✅ <code>MathTeX</code> 更稳定可靠</li>
<li>✅ 动画构建更直观</li>
<li>✅ 代码质量更高</li>
<li>✅ 文档更完善</li>
<li>✅ 可复现的随机效果</li>
</ul>
<p>特别是 <code>Mobject.always</code> 这个新特性,让动画编写变得更加优雅。强烈建议大家升级体验!</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19628043
頁: [1]
查看完整版本: 🚀 Manim CE v0.20.0 发布:动画构建更丝滑,随机性终于“可控”了!