Manim进阶:用背景图片让你的数学视频脱颖而出

news/2025/11/26 20:15:48/文章来源:https://www.cnblogs.com/wang_yb/p/19274531

Manim动画久了,你是否厌倦了那万年不变的黑色虚空?

很多初学者(甚至老手)都想给动画加个背景图,但往往会遇到两个问题:

  1. 怎么加? 是把图片放进去,还是设置相机?
  2. 看不清! 背景花里胡哨,前面的文字公式瞬间“隐身”了。

今天,我们就来揭开Manim动画中一个简单却强大的技巧--为动画添加背景。

通过几个小示例,分别演示两种完全不同的背景处理思路。

1. 舞台布景法

使用ImageMobject类,这是最直观、最常用的方法。

它的逻辑是:背景图片只是舞台上的一个普通演员,只是它长得特别大,而且站得特别靠后。

这种方式的特点是:

  • 高度灵活:背景就是个对象(Mobject),所以它可以动!你可以让背景旋转、平移、缩放,甚至改变颜色。

  • 层级管理:需要手动把它的 z_index 设低,或者最先添加它。

下面的第一个示例中,实现一个简单的动态背景,操作背景和操作一般的Mobject是一样的。

class Method1ImageMobject(Scene):def construct(self):# 1. 加载图片(确保这个图片是存在的)bg = ImageMobject("./assets/紫色梦幻星空.jpg")# 2. 核心操作:撑满屏幕并允许超出# 我们把高度设为屏幕高度的 2 倍,这样才有移动的空间bg.scale_to_fit_height(config.frame_height * 2)# 3. 核心操作:放到最底层bg.set_z_index(-100)self.add(bg)# 前景物体text = Text("方法一:ImageMobject", font_size=40, color=WHITE)sub = Text("背景可以动!", font_size=24, color=YELLOW).next_to(text, DOWN)self.play(Write(text), FadeIn(sub))# 4. 演示优势:让背景缓慢移动self.play(bg.animate.shift(LEFT * 2), rate_func=linear)self.play(bg.animate.shift(UP * 2), rate_func=linear)self.play(bg.animate.shift(RIGHT * 2), rate_func=linear)self.play(bg.animate.shift(DOWN * 2), rate_func=linear)self.wait()

下面的示例也很简单,就是显示一段简单的公式。

不过,大家可以比较看看,相比于默认的黑色背景,加一个学校的黑板背景,是不是更有亲和力?

class Method2ImageMobject(Scene):def construct(self):# 1. 加载图片bg = ImageMobject("./assets/黑板.jpg")# 2. 调整大小铺满屏幕bg.scale_to_fit_height(config.frame_height)bg.scale_to_fit_width(config.frame_width)# 3. 核心操作:放到最底层bg.set_z_index(-100)self.add(bg)# 前景物体math = MathTex(r"\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}")self.play(Write(math))

2. 主角光环法

除了上面两种,还有一种比较特殊的方式,也就是BackgroundColoredVMobjectDisplayer类。

它是一个负责渲染的类,专门处理一种特殊情况:当物体拥有“背景色描边”时,如何遮挡住它背后的东西

我们通过 set_background_stroke() 来调用这个机制。

严格来说不是 “设置全屏背景”,而是 “给物体加一个局部背景(Matte)”,这是在花哨背景下生存的必备技能。

它的特点是:

  • 局部遮挡:在文字或公式周围生成一圈不透明的轮廓。
  • 增强对比:专门用于解决“背景太花,文字看不清”的问题。

下面的示例故意构造了一个混乱的背景,然后比较看看,这两个一样的公式,是不是加了局部背景的公式更加清晰。

class ReadableFormulaOnImage(Scene):def construct(self):# 1. 先设置一个很花的背景(这里为了演示,我们用随机噪点模拟一张复杂的图)# 实际使用中,请换成你的 image.jpgnoise = Rectangle(width=16, height=10)noise.set_fill(color=[BLUE, RED, GREEN, YELLOW], opacity=0.5)# 把它搞得乱一点for _ in range(20):line = Line(start=[np.random.uniform(-7, 7), np.random.uniform(-4, 4), 0],end=[np.random.uniform(-7, 7), np.random.uniform(-4, 4), 0],color=random_color(),stroke_width=5,)self.add(line)self.add(noise)# 2. 普通的文字(在花背景下很难看清)bad_text = MathTex(r"\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}")bad_text.shift(UP)# 3. 【核心技巧】使用 BackgroundColoredVMobject 机制# set_background_stroke 会给文字加一层“描边”# 这层描边是不透明的,会利用 Displayer 类遮挡住背景!good_text = MathTex(r"\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}")good_text.set_background_stroke(color=BLACK, width=8)  # 黑色描边,宽度设大一点good_text.shift(DOWN)# 动画演示对比self.play(Write(bad_text))self.play(Write(good_text))  # 清晰可见!self.wait()

3. 两种方式比较

两种方式各有自己的应用场景,对比如下:

特性 舞台布景法 主角光环法
本质 场景中的一个巨大物体 物体自身的描边属性
主要用途 动态背景、视差滚动、多层背景 高亮主体、对抗花哨背景
动画能力 ⭐⭐⭐⭐⭐ (极强) ⭐⭐⭐ (跟随物体运动)
代码复杂度 中 (需手动调大小/层级) 低 (一行设置)
文档对应 Mobject BackgroundColoredVMobjectDisplayer
最佳场景 漂浮的云、移动的星空 字幕、复杂背景下的公式

4. 总结

简单来说,如果你想做一段电影感的片头,背景需要缓慢推移,请用 舞台布景法

如果你发现文字看不清了,请使用 主角光环法 (set_background_stroke) 给文字加个 “光环”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/977609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 AI 培训机构权威推荐榜排名揭晓:AI时代新商学引领行业破局之路

2025 AI 培训机构权威推荐榜排名揭晓:AI时代新商学引领行业破局之路 近期,2025 AI 培训机构覆盖度权威推荐榜正式揭晓,这一榜单不仅反映了各机构在市场中的影响力,也凸显出当前 AI 培训机构领域面临的诸多挑战。 行…

小程序商城客服系统传递咨询产品信息卡片,传递订单信息卡片

vx:llike620 gofly.v1kf.com你是不是也遇到过这样的困境:用户在小程序商城里看中一款产品,想要咨询客服,却只能干巴巴地发一句“这个产品怎么样?”——客服完全不知道用户在看哪个商品,只能机械回复:“亲,请问您…

Lab4AI与国内顶会展开合作!一键体验 CVPR/ICCV/NeurIPS 顶会论文复现

01 Lab4AI与国内顶级会议的论文复现合作 Lab4AI 大模型实验室是一个专注于高性能 GPU 应用场景的实践型内容社区与实操平台,致力于构建“论文 → 代码 → 教学 → 传播 → 孵化”的完整闭环。平台涵盖论文复现、项目实…

委托和事件的区别

1.本质:委托是类型安全的函数指针,可以指向一个或多个方法。事件是对委托的封装,提供受控的发布-订阅模型。 2.关键字:delegate和event。 3.访问权限:委托公有或私有,可被外部直接调用或赋值。事件外部只能通过 …

2025:如何利用AI不再错过任何一个opening job - M-T

img { max-width: 60% !important; height: auto; display: block; margin: 0 auto 1em } .markdown-body img { max-width: 60% !important } 核心:利用MCP server省钱省力爬job list的邪修打法,亲测Indeed,LinkedI…

SIGIR会议聚焦包容性AI与多语言技术

本文介绍了SIGIR会议上关于构建更包容AI系统的研究,包括多语言仇恨言论检测技术和基于社交媒体的灾害检测系统,通过跨语言学习和特定领域嵌入技术提升模型性能。某机构在SIGIR:迈向更包容的AI SIGIR 2021会议即将召…

NeurlPS 2024! 扩散模型用于世界建模:视觉细节在Atari环境中至关重要| 计算机视觉 | 强化学习2

01 论文概述 论文名称:Diffusion for World Modeling: Visual Details Matter in Atari ——扩散模型用于世界建模:视觉细节在 Atari 环境中至关重要 👉一键直达论文 👉Lab4AI大模型实验室论文🌟 简介 在基于模…

48(11.28)

上了网课形势政策

Unclutter 黑五 Mac App 大包测评

今年 Unclutter 还是准时推出了 BLACK FRIDAY MAC APPS COLLECTION,这也是每年黑五 MacOS 软件最值得的大包之一。考虑到今年 BundleHunt 还表现得较为拉跨的情况下,这个大包的性价比就显得更高了。直接拿下整个大包…

详细介绍:VS Code 新旧版本 Remote-SSH 内网离线连接服务器方法(版本 ≤ 1.78.x 及 ≥ 1.79.0)

详细介绍:VS Code 新旧版本 Remote-SSH 内网离线连接服务器方法(版本 ≤ 1.78.x 及 ≥ 1.79.0)2025-11-26 20:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !i…

44(11.24)

上了统一建模语言,上了数据结构,上了Java课

47(11.27)

上了数据结构,上了排球课

46(11.26)

上了离散数学,上了马原

45(11.25)

上了工程实训,上了英语视听说

Python模块与包完全教程:从导入到封装发布(附实战)

模块(Module)和包(Package)是Python代码组织与复用的核心机制——模块让你告别“复制粘贴代码”,包让你能系统化管理多个模块。本文从零基础视角出发,详解模块的导入、自定义、包的创建与使用,甚至延伸到包的封…

29(11.3)

上了Java课,受益匪浅

[豪の算法奇妙冒险] 代码随想录算法训练营第八天 | 344-反转字符串、541-反转字符串II、Carl54-替换数字

LeetCode344 反转字符串、LeetCode541 反转字符串II、Carl54 替换数字代码随想录算法训练营第八天 | 344-反转字符串、541-反转字符串II、Carl54-替换数字LeetCode344 反转字符串题目链接:https://leetcode.cn/proble…

【Webpack连载一】入门简介。了解为什么需要Webpack,解决哪些开发中通病 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

31(11.5)

上了离散数学,上了马原

26 10.29

学习打游戏跑步