ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Manim v0.15.0 版本更新详解:BarChart 重构、frozen_frame 等待机制与 Jupyter 媒体嵌入

Manim v0.15.0 版本更新详解:BarChart 重构、frozen_frame 等待机制与 Jupyter 媒体嵌入 Manim v0.15.0 版本更新详解BarChart 重构、frozen_frame 等待机制与 Jupyter 媒体嵌入【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim导读本文基于 ManimManim Community Editionv0.15.0 官方变更日志docs/source/changelog/0.15.0-changelog.rst系统梳理该版本于 2022 年 2 月 26 日发布的核心技术变化。全文围绕三大主线展开BarChart从独立类重构为继承Axes的破坏性变更、Wait/Scene.wait新增frozen_frame参数带来的静态帧渲染控制能力以及 Jupyter 环境下media_embed配置项对笔记本媒体嵌入行为的控制。读完本文你将掌握 v0.15.0 中 API 迁移要点、冻结帧机制在 Cairo 与 OpenGL 两种渲染器下的工作方式以及如何在新版中正确编写图表与 Jupyter 动画代码。版本概况v0.15.0 发布于 2022 年 2 月 26 日共有 34 位贡献者参与、合并了 71 个 Pull Request。这是 Manim 在mobject模块结构整理与动画系统性能优化方面的一个重要版本主要变更包括破坏性变更mobject模块结构改进、BarChart重构为Axes子类弃用清理移除自 v0.10.0 与 v0.11.0 起已弃用的方法与类并弃用ShowCreationThenFadeOut新特性media_embed配置项、frozen_frame等待参数与Scene.pause()便捷方法大量性能增强VMobject.insert_n_curves_to_point_list、Mobject.become、OpenGLCamera视图矩阵缓存等约 17 项 Bug 修复覆盖图表、文本、图形相交计算、OpenGL 预览崩溃与 Windows 路径编码等场景。Breaking Changes模块结构调整与 BarChart 重构mobject 模块结构调整ArrowTip 的导入路径变化PR #2476 对mobject模块的内部结构进行了整理直接影响开发者日常代码的是箭头尖端Arrow tips的导入路径。在 v0.15.0 之前箭头尖端类型可以直接从manim.mobject.geometry导入升级后必须改为from manim.mobject.geometry.tips import ArrowTip, StealthTip这一变更与仓库中 manim/mobject/geometry/tips.py 的目录布局一致tips.py独立成模块其中ArrowTip继承自VMobject并带有ConvertToOpenGL元类以兼容 OpenGL 渲染器StealthTip进一步继承ArrowTip。如果你的代码中使用了自定义箭头样式或直接引用了这些类升级时需同步修改 import 语句。BarChart 重构从独立实现到 Axes 子类PR #2387 是本次版本最值得关注的破坏性变更BarChart不再是一个独立实现的类而是直接继承自Axes。从 manim/mobject/graphing/probability.py 的源码可以看到BarChart的类定义与文档说明class BarChart(Axes): Creates a bar chart. Inherits from :class:~.Axes, so it shares its methods and attributes. Each axis inherits from :class:~.NumberLine, so pass in x_axis_config/y_axis_config to control their attributes. 这一继承关系带来的直接收益复用Axes的全部方法坐标轴配置、范围计算、坐标系变换等能力开箱即用配置更统一x_axis_config与y_axis_config可直接控制坐标轴坐标轴本身继承自NumberLine的各项属性例如字体大小新增get_bar_labels()方法用于为每个柱子标注数值。新版BarChart的构造参数在 probability.py 中有完整定义核心参数如下参数含义默认行为values决定每根柱子高度的数值序列必填支持负数bar_names每根柱子的名称序列可选长度不必与values一致y_rangey 轴数值范围[min, max, step]为None时根据values的极值自动推算x_length/y_lengthx/y 轴长度为None时按柱数与屏幕宽度自动计算bar_colors柱子颜色序列长度不足时自动插值出中间色bar_width单根柱子的宽度比例取值须在 0 到 1 之间bar_fill_opacity/bar_stroke_width填充透明度与描边宽度控制柱子视觉样式官方文档示例见 probability.py展示了包含负值柱子与标签的完整用法class BarChartExample(Scene): def construct(self): chart BarChart( values[-5, 40, -10, 20, -3], bar_names[one, two, three, four, five], y_range[-20, 50, 10], y_length6, x_length10, x_axis_config{font_size: 36}, ) c_bar_lbls chart.get_bar_labels(font_size48) self.add(chart, c_bar_lbls)弃用清理PR #2568 移除了自 v0.10.0 与 v0.11.0 起便标记为弃用的方法和类长期停留在旧 API 上的项目在升级到 v0.15.0 前应重点检查代码中是否还在使用这些过时接口。同时PR #2457 将ShowCreationThenFadeOutmanim/animation/indication.py 中的指示类动画标记为弃用官方建议转向其他动画组合实现同类效果。新特性frozen_frame 冻结帧机制与 Scene.pause()背景普通 wait 与静态帧的差异在 v0.15.0 之前Scene.wait()的渲染行为相对固定。PR #2504 为等待动画引入了静态static与非静态的精细控制其核心是新增的关键字参数frozen_frame同时作用于Wait动画类与Scene.wait方法frozen_frameTrue输出冻结帧不再执行 updater 函数适合纯粹停顿的画面frozen_frameFalse渲染循环正常推进继续调用 updater 函数适合等待期间对象仍在运动/更新的场景frozen_frameNone默认由场景自动判断。根据Wait类文档manim/animation/animation.py此时Scene.play会调用Scene.should_mobjects_update自行决定该等待能否作为静态帧处理。源码层面的实现在 manim/animation/animation.py 中Wait.__init__对参数做了如下处理def __init__( self, run_time: float 1, stop_condition: Callable[[], bool] | None None, frozen_frame: bool | None None, rate_func: Callable[[float], float] linear, **kwargs, ): if stop_condition and frozen_frame: raise ValueError(A static Wait animation cannot have a stop condition.) ... self.is_static_wait: bool frozen_frame值得注意的实现约束frozen_frameTrue与stop_condition不能同时使用因为需要轮询停止条件本身就意味着帧必须持续渲染这与静态帧的语义冲突源码会直接抛出ValueError。Scene.wait侧的实现位于 manim/scene/scene.py其 docstring 明确了三种取值的行为并将参数透传给Wait后经由play执行def wait( self, duration: float DEFAULT_WAIT_TIME, stop_condition: Callable[[], bool] | None None, frozen_frame: bool | None None, ) - None: ... self.play( Wait( run_timeduration, stop_conditionstop_condition, frozen_framefrozen_frame, ) )自动判断逻辑在compile_animation_datascene.py中当且仅当动画列表只有一个Wait且判定无需更新 mobjects 时才会把is_static_wait置为True并交由渲染器执行静态帧逻辑。渲染器如何消费冻结帧标记两种渲染器都通过scene.is_current_animation_frozen_frame()来判断当前是否为静态帧Cairo 渲染器manim/renderer/cairo_renderer.pyOpenGL 渲染器manim/renderer/opengl_renderer.py该方法的定义在 manim/scene/scene.py判断条件为唯一动画是Wait且is_static_wait为真def is_current_animation_frozen_frame(self) - bool: assert self.animations is not None return ( isinstance(self.animations[0], Wait) and len(self.animations) 1 and self.animations[0].is_static_wait )新增的 Scene.pause()随frozen_frame一起引入的还有便捷方法Scene.pause()其实现manim/scene/scene.py就是wait(frozen_frameTrue)的别名def pause(self, duration: float DEFAULT_WAIT_TIME) - None: Pauses the scene (i.e., displays a frozen frame). duration self.validate_run_time(duration, self.pause, duration) self.wait(durationduration, frozen_frameTrue)典型用法class PauseExample(Scene): def construct(self): dot Dot() self.add(dot) self.wait(1) # 普通等待updater 仍会被调用 self.pause(1) # 冻结帧等待updater 不执行画面静止OpenGL 相关默认行为变化PR #2504 同时调整了 OpenGL 渲染路径的两处默认行为updater 函数不再在添加时默认被调用改为渲染循环中按需触发Scene.should_mobjects_update现在会尊重Wait.frozen_frame的设置且自动判定静态帧时也会将 Scene 级 updater 纳入考虑。配套的修复 PR #2538 解决了使用frozen_frame时 OpenGL 预览窗口闪烁的问题使静态帧在 OpenGL 下也能稳定显示。新特性Jupyter 中的 media_embed 配置PR #2442 为 Jupyter 集成新增了media_embed配置项用于控制笔记本中的媒体是否以嵌入embed形式输出。该配置项在 manim/_config/default.cfg 中的默认值为False[jupyter] media_embed False media_width 60%%配置读取与校验逻辑位于 manim/_config/utils.py其属性访问器utils.py将值强制转换为布尔型。嵌入 vs 引用何时需要 media_embed根据%manim魔数命令的 docstringmanim/utils/ipython_magic.pymedia_embed的取舍非常明确默认False输出视频/图片以文件路径引用方式呈现笔记本体积小True将媒体直接嵌入笔记本。缺点是会显著增大 .ipynb 文件体积但在以下场景中几乎是必需的Google Colab 等平台会自动启用嵌入除非通过config.embed False显式抑制笔记本或其转换出的 HTML 文件需要移动到远离媒体文件目录的位置时使用 Sphinx 与 JupyterBook 构建文档时参见仓库中的manimSphinx 指令manim/utils/docbuild/manim_directive.py。在笔记本中的两种设置方式方式一在单元格内通过config对象直接设置见 ipython_magic.py 的官方示例%%manim -v WARNING --disable_caching -qm BannerExample config.media_width 75% config.media_embed True class BannerExample(Scene): def construct(self): self.camera.background_color #ece6e2 banner_large ManimBanner(dark_themeFalse).scale(0.7) self.play(banner_large.create()) self.play(banner_large.expand())方式二写入配置文件如manim.cfg的[jupyter]段[jupyter] media_embed True media_width 100%底层实现Colab 自动嵌入逻辑在 manim/utils/ipython_magic.py 中可以看到嵌入判断的完整逻辑魔数命令渲染完成后会读取config[media_embed]若未显式开启则检测当前是否运行在 Google Colab通过检查get_ipython()的字符串表示中是否包含google.colab自动将embed置为True否则按配置处理。最终视频通过Video对象配合html_attributes其中使用media_width控制展示宽度在笔记本中显示。Enhancements其他值得关注的能力增强文本类 Mobject 继承父级颜色PR #2467 让MathTex、Tex、Text与MarkupText在作为子对象添加时继承父 mobject 的颜色减少了手动同步颜色的样板代码实现见 manim/mobject/text/tex_mobject.py 与 manim/mobject/text/text_mobject.py。Graph 能力扩展PR #2565Graph.add_edges现在允许传入顶点配置关键字参数PR #2478为树形图布局tree graph layout提供了备选缩放算法。颜色属性属性化PR #2332 将color、stroke_color、fill_color改为property属性化访问为后续更灵活的颜色管理与子对象继承奠定了基础。动画引入/移除对象的修正PR #2396 系统性地修正了动画引入或移除对象的行为ShowPassingFlash在动画结束时现在会正确移除其引入的对象Animation新增与remover对称的introducer关键字参数更新了Graph顶点添加时的处理逻辑。渲染性能优化PR #2535VMobject.insert_n_curves_to_point_listmanim/mobject/types/vectorized_mobject.py性能提升PR #2516为OpenGLCamera缓存视图矩阵manim/camera/three_d_camera.py避免每帧重复计算PR #2508优化Mobject.become的性能PR #2537新增对PySide 坐标系manim.camera.mapping_camera相关的支持。3D 场景兼容性PR #2158 为ThreeDScene.add_fixed_orientation_mobjects与add_fixed_in_frame_mobjects增加了OpenGL 渲染器兼容性使 3D 场景在两种渲染后端下行为一致。Fixed Bugs关键缺陷修复盘点v0.15.0 共修复约 17 项缺陷按影响面分类如下图形与坐标系统PR #2580修复 manim/utils/space_ops.py 中find_intersection的计算错误PR #2548修复对数 x 轴下Axes绘图plot的 BugPR #2490修复SVGMobject中变换应用顺序错误manim/mobject/svg/svg_mobject.pyPR #2576修复从Graph移除边时的动画缺陷PR #2556修复创建Table时高亮单元格显示异常manim/mobject/table.py。文本与排版PR #2559修复 ManimPango 设置下Text的行号设置问题PR #2530统一默认文本值的单一事实来源消除多处默认值不一致。OpenGL 与 GUIPR #2526修复使用--enable_gui时的segfault段错误崩溃PR #2538修复frozen_frame下 OpenGL 预览闪烁PR #2487修复ThreeDCamera.remove_fixed_orientation_mobjects无法移除对象的问题。文件与平台PR #1547修复Windows 用户路径含特定 Unicode 字符导致的问题PR #2528修复 GIF 的自定义命名并补充了相应测试PR #2494修复 GIF 预览相关问题PR #2357修复 macOS 下screeninfo.get_monitors的兼容问题。其他PR #2574改进 manim/utils/tex_file_writing.py 的错误信息可读性PR #2557修复Camera.make_background_from_func中的 logger 缺陷PR #2444修复VectorScene.add_axes坐标轴添加问题。代码质量与基础设施变更版本还包含一系列内部重构理解这些有助于评估升级风险PR #2573ValueTrackermanim/mobject/value_tracker.py被移回mobject模块内PR #2524重写 manim/utils/space_ops.py空间几何工具模块PR #2437清理 manim/utils/simple_functions.py移除与 numpy 数组除法重复的fdiv、改用 scipy 的choose实现并用lru_cache缓存大小 10因为贝塞尔曲线仅使用 2 choose k 与 3 choose k以np.clip取代clip_in_placePR #2429全面升级为 future-style 类型注解PR #2464Pillow 依赖从 8.4.0 升级至 9.0.0PR #2376更新依赖以支持Python 3.10PR #2566从 manim/scene/scene_file_writer.py 移除已无用的直播livestream相关导入与函数PR #2475移除 setuptools 依赖。升级建议与兼容性小结针对计划升级到 v0.15.0 的项目可按下述清单自查箭头尖端导入确认manim.mobject.geometry.tips中的ArrowTip/StealthTip导入路径已更新BarChart 用法核对values、bar_colors、y_range等参数是否仍符合新签名需要柱子数值标注时改用get_bar_labels()弃用 API清除自 v0.10.0/v0.11.0 起已弃用、本版本正式移除的接口避免在ShowCreationThenFadeOut上积累新代码等待动画语义若等待期间依赖 updater 持续刷新如渐变、游标移动确认Wait的静态帧自动判断是否符合预期必要时显式传入frozen_frameFalse或直接使用Scene.pause()表达暂停意图Jupyter 输出如需迁移笔记本或构建文档在manim.cfg的[jupyter]段设置media_embed TruePython 环境本版本已针对 Python 3.10 更新依赖请确保解释器版本在受支持范围内。整体而言v0.15.0 通过BarChart的Axes继承重构统一了图表 API以frozen_frame/Scene.pause()精确化了等待语义并在渲染性能与 OpenGL 稳定性上做了大量收敛同时清理了数个版本累积的弃用接口为后续 v0.16.0 等版本的 API 演进铺平了道路。【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表