- AI 技能/插件
- 音视频
- 视频处理
- 人工智能
【免费下载链接】video-use
Edit videos with coding agents
本文是 video-use 仓库中
manim-video技能(Skill)的视觉设计参考文档(skills/manim-video/references/visual-design.md)的完整展开,用于指导 3Blue1Brown 风格的数学与技术动画制作。它回答"如何让每一个画面都清晰、克制、可读"这一核心问题:从 12 条设计原则、6 种布局模板、3 套官方配色方案,到 monospace 字体选型与 Pango 渲染细节,再到逐帧视觉层级自检。读完本文,你可以照着规范写出具有一致视觉语言、可直接用于视频生产的 Manim 场景代码,并在渲染前自查画面质量。
一、为什么要有一份"视觉设计规范"
在 video-use 的 manim-video 技能中,Manim 负责把数学概念、算法、架构图变成"每一帧都在教学"的动画。技能文档开篇的 Creative Standard 明确指出:
- 先想叙事,再写代码——每一个动画都要揭示结构,纠正某个误解,制造"aha moment";
- 首次渲染就达到视觉清晰与美学统一——不允许"看起来像 AI 生成的幻灯片"的输出;
- 所有场景共享统一视觉语言——同一套配色、一致的字体规格、匹配的动画节奏。
一份"技术上正确但每帧都用随机颜色"的视频,在美学上依然是失败的。这正是visual-design.md存在的意义:它把"好看"拆解成可执行、可检查的规则。规范共分四个部分:12 条核心原则、布局模板、配色方案、字体选择,外加一个视觉层级自检清单。下文逐一展开,并结合仓库内的 SKILL.md、production-quality.md、mobjects.md等文档做源码级印证。
二、12 条核心视觉设计原则
原文档给出 12 条原则,它们是所有场景代码的"宪法"。逐条展开:
先几何、后代数(Geometry Before Algebra)——先展示形状,再展示方程。视觉记忆的编码速度远快于符号记忆;当观众先看到几何模式,再看到公式时,公式会显得"水到渠成"(SKILL.md 的 Creative Standard 同样强调这一点)。
透明度分层(Opacity Layering)——主元素
PRIMARY=1.0、上下文元素CONTEXT=0.4、结构性元素(坐标轴、网格)GRID=0.15。永远不要把所有东西都以全亮度展示。大脑按显著度分层处理视觉信息,通过亮度即可引导注意力,无需多余装饰。每场一个概念(One New Idea Per Scene)——每个 Scene 只引入一个概念。当需要表达多个点时,拆成多个场景(详见
scene-planning.md的叙事弧结构)。空间一致性(Spatial Consistency)——同一个概念在整个视频中始终占据屏幕同一区域。观众建立起"这个位置 = 这个含义"的潜意识映射后,理解成本会大幅下降。
颜色即含义(Color = Meaning)——颜色赋给"概念"而不是"对象"。如果速度是蓝色,那么它从头到尾都保持蓝色。一旦某种颜色被赋予含义,它在后续所有场景中都不能被挪用给其他概念(
production-quality.md的"Color meaning consistency"一节对此有专门强调)。渐进披露(Progressive Disclosure)——先展示最简单版本,再逐步叠加复杂度。对应 SKILL.md 的创作方向,也对应
equations.md中"分步推导"的模式:Write(step1)→wait→TransformMatchingTex(step1, step2)。变换而非替换(Transform, Don't Replace)——用
Transform/ReplacementTransform表现元素之间的关联,而不是把旧元素擦掉再写新的。这既符合认知(观众看到的是"演变"而非"跳跃"),也是animations.md中强调的规范动作。留出呼吸空间(Breathing Room)——展示新内容后至少
self.wait(1.5)。SKILL.md 更具体地给出节奏表:关键方程揭示后wait(2.0),"aha moment" 揭示后wait(3.0)。观众需要时间吸收刚出现的内容,永远不要连续播放动画。视觉重量平衡(Visual Weight Balance)——不要把元素全部堆在一侧。与布局模板(见下节)配合使用:全屏居中、左右分栏、上下分区,让画面重心稳定。
一致的动作词汇表(Consistent Motion Vocabulary)——选取一小撮动画类型(如
Write、FadeIn、Create、GrowFromCenter)并反复复用,形成风格辨识度;但相邻场景不要使用完全相同的动画类型(production-quality.md的"Variety audit"要求:Scene 3 若全部用 Write,Scene 4 就应换 FadeIn 或 Create)。深色背景、浅色内容(Dark Background, Light Content)——
#1C1C1C到#2D2B55的背景最大化对比度。注意:在深色背景上,白底上鲜艳的颜色会显得"发闷",应选用明亮饱和的颜色(详见配色章节)。有意图的留白(Intentional Empty Space)——每帧至少保留 15% 的空白区域。空不是浪费,而是让主要内容成为唯一视觉焦点的手段。
三、六种布局模板
原文档定义了 6 种可复用布局,每种都明确了适用场景和坐标习惯。这些模板与 SKILL.md 中"每场使用不同布局、不要总是居中"的 per-scene 变化要求直接配合。
FULL_CENTER(全屏居中)
一个主元素居中,标题在上方,注释在下方。适用于单一方程、单一示意图、标题卡。
title = Text("Fourier Series", font_size=48, color=PRIMARY, weight=BOLD, font=MONO) title.to_edge(UP, buff=0.5) # 标题区:y ∈ [2.5, 3.5] main = Circle(radius=1.5, color=PRIMARY).move_to(ORIGIN) note = Text("Convergence at discontinuities", font_size=18, color=DIM, font=MONO) note.to_edge(DOWN, buff=0.5) # 注释区:y ∈ [-3.5, -2.5]LEFT_RIGHT(左右分栏)
两个元素并排,分别位于x=-3.5与x=3.5。适用于方程+可视化、前后对比、双方案比较。
equation = MathTex(r"\nabla L = \frac{\partial L}{\partial w}").move_to(LEFT * 3.5) diagram = Circle(radius=1.5, color=BLUE).move_to(RIGHT * 3.5)TOP_BOTTOM(上下分区)
主元素位于y=1.5,支撑内容位于y=-1.5。适用于概念+示例、定理+分情况讨论。
GRID(网格)
通过arrange_in_grid()排布多个元素。适用于对比矩阵、多步骤流程(mobjects.md中Group/VGroup均支持arrange_in_grid())。
items = VGroup(*[Square(side_length=1, color=color) for color in palette]) items.arrange_in_grid(rows=2, cols=3, buff=0.5)PROGRESSIVE(渐进展开)
元素逐个出现,沿 DOWN 方向排列并对齐到 LEFT。适用于算法、证明、分步过程。配合animations.md的ShowIncreasingSubsets或LaggedStart实现"逐条揭示"。
lines = VGroup(*[Text(line, font_size=24, font=MONO) for line in steps]) lines.arrange(DOWN, aligned_edge=LEFT, buff=0.4) self.play(LaggedStart(*[Write(l) for l in lines], lag_ratio=0.3, run_time=3))ANNOTATED_DIAGRAM(带标注的示意图)
中央放示意图,周围是带箭头的浮动标签。适用于架构图、带标注的插图。箭头与标签的组合手法详见decorations.md:Arrow+GrowArrow入场、label.next_to()定位,标注遵循"出现 → 停留 → 消失"的生命周期,避免变成视觉噪音。
四、配色方案
原文档提供 3 套官方调色板,SKILL.md 中另有一套Monochrome极简方案,一并列出:
| 调色板 | 背景 Background | 主色 Primary | 辅色 Secondary | 强调色 Accent | 适用场景 |
|---|---|---|---|---|---|
| Classic 3B1B | #1C1C1C | BLUE(#58C4DD) | GREEN(#83C167) | YELLOW(#FFFF00) | 通用数学/计算机科学 |
| Warm Academic | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | 亲和、易接近的内容 |
| Neon Tech | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | 系统、架构类内容 |
| Monochrome(SKILL.md) | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | 极简风格 |
# Classic 3B1B 完整定义(来自 visual-design.md) BG="#1C1C1C"; PRIMARY=BLUE; SECONDARY=GREEN; ACCENT=YELLOW; HIGHLIGHT=RED深色背景上的颜色表现
production-quality.md对深色背景(#0D1117、#1C1C1C)给出了明确的选色警告:
- 在深色背景上表现良好的颜色:明亮且饱和的
#58C4DD、#83C167、#FFFF00、#FF6B6B; - 在深色背景上不可用的颜色:
#666666(几乎不可见)、#2244AA(太暗)。
同时它重申了透明度分层规范:结构元素(坐标轴、网格)opacity0.15,上下文元素0.3-0.4,主元素1.0。
场景内的颜色使用规范
- 把颜色常量定义在文件顶部,跨场景复用(
scene-planning.md的 Cross-Scene Consistency 模式); - 每个场景从调色板中选取不同的主导色,避免所有场景千篇一律;
- 一旦
PRIMARY在 Scene 1 代表"模型",它在所有场景中都代表"模型",严禁中途改作他用。
五、字体选择:为什么必须用等宽字体
这是原文档着墨最多、也最具实操价值的一节。结论非常明确:所有文本一律使用等宽(monospace)字体。
根本原因:Pango 渲染器的字距缺陷
Manim 的文本渲染走 Pango 管线,对比例字体(Helvetica、Inter、SF Pro、Arial)在任何字号和分辨率下都会产生破损的字距(broken kerning):字符相互重叠、间距不一致。这是 Pango 的固有局限,不是 Manim 的 bug。等宽字体字符宽度固定,从设计上就杜绝了字距问题。
推荐字体表
| 用途 | 首选字体 | 回退字体 |
|---|---|---|
| 所有文本(默认) | "Menlo" | "Courier New"、"DejaVu Sans Mono" |
| 代码、标签 | "JetBrains Mono"、"SF Mono" | "Menlo" |
| 数学公式 | 用MathTex(走 LaTeX 渲染,不经过 Pango) | — |
字体可用性与默认选择
- macOS:Menlo(预装)、SF Mono;
- Linux:DejaVu Sans Mono(预装)、Liberation Mono;
- 跨平台:JetBrains Mono(需手动安装)。
"Menlo"是最安全的默认值——macOS 预装,Linux 系统会自动回退到 DejaVu Sans Mono。SKILL.md 与production-quality.md都要求在文件顶部定义一次常量并在全项目复用:
MONO = "Menlo" # 定义一次,全文件复用 title = Text("Fourier Series", font_size=48, color=PRIMARY, weight=BOLD, font=MONO) label = Text("n=1: (4/pi) sin(x)", font_size=20, color=BLUE, font=MONO) note = Text("Convergence at discontinuities", font_size=18, color=DIM, font=MONO) # 数学公式永远用 MathTex,不用 Text equation = MathTex(r"\nabla L = \frac{\partial L}{\partial w}")何时可以破例使用比例字体
只有一种例外:大号标题文本(font_size >= 48)且字符串很短(1-3 个单词)。除此之外——标签、描述、多词文本、小字号——一律用等宽字体。
精细文本控制:MarkupText
Text()不支持letter_spacing或字距参数。需要精细控制时,改用MarkupText+ Pango 属性。注意 Pango 单位:字距单位为 1/1024 磅(point),因此letter_spacing="6000"≈ 5.86pt:
# 字距控制(Pango 单位:1/1024 磅) MarkupText('<span letter_spacing="6000">HERMES</span>', font_size=18, font="Menlo") # 加粗指定单词 MarkupText('This is <b>important</b>', font_size=24, font="Menlo") # 给指定单词上色 MarkupText('Red <span foreground="#FF6B6B">warning</span>', font_size=24, font="Menlo")最小字号:18
font_size=18是任何分辨率下可读文本的下限。低于 18,字符在-ql(480p)下会模糊,即使在-qh(1080p)下也勉强可读。SKILL.md 的 Typography Scale 给出了完整字号体系,可对照使用:
| 角色 | 字号 | 用途 |
|---|---|---|
| Title | 48 | 场景标题、开场文字 |
| Heading | 36 | 场景内小节标题 |
| Body | 30 | 说明文字 |
| Label | 24 | 标注、坐标轴标签 |
| Caption | 20 | 字幕、细注 |
六、每帧视觉层级自检清单
原文档以"逐帧自检"收尾,5 个问题构成一套可执行的验收标准。对每一帧问一遍:
- 观众要看的唯一重点是什么?(最亮/最大的那个)
- 什么是上下文?(压暗到 0.3-0.4)
- 什么是结构性的?(压暗到 0.15)
- 是否保留了足够留白?(>15%)
- 所有文本在手机尺寸下是否可读?
配套的硬性约束
production-quality.md为这份清单提供了量化依据:
- 坐标预算:默认 16:9 画幅约 14.2 宽 × 8.0 高,扣除边距后可用区域为
x ∈ [-6.5, 6.5]、y ∈ [-3.5, 3.5];顶部标题区y ∈ [2.5, 3.5],底部注释区y ∈ [-3.5, -2.5],主内容区x ∈ [-6.0, 6.0]、y ∈ [-2.5, 2.5]; - 同屏元素硬上限:6 个。需要更多时,把旧元素压暗到 0.3、移除已完成使命的元素,或拆成两个场景;
- 长文本防溢出:对可能超长的文本设置最大宽度,
text.set_width(config.frame_width - 1.0); - 文本防重叠:
.to_edge()的buff >= 0.5;同一位置出现新文本时用ReplacementTransform而非直接Write覆盖。
文本在复杂背景上的可读性
当标签叠加在图表、图形之上时,两种方案(mobjects.md):
# 方案一:给文本加黑色背景描边(3B1B 的做法) label.set_stroke(BLACK, width=5, background=True) # 方案二:半透明背景块 bg = BackgroundRectangle(equation, fill_opacity=0.7, buff=0.2, color=BLACK)七、把规范落到代码里:与流水线的衔接
视觉规范不是孤立的审美条目,它贯穿 SKILL.md 的完整流水线PLAN → CODE → RENDER → STITCH → AUDIO → REVIEW:
1. 规划阶段(plan.md):在写代码前就定好叙事弧、每场布局、调色板与含义分配(PRIMARY= 主概念等),并参考scene-planning.md的规划模板。
2. 编码阶段(script.py):文件顶部统一定义颜色、字号、字体与动画节奏常量(scene-planning.md的 Cross-Scene Consistency):
BG = "#1C1C1C" PRIMARY = "#58C4DD" SECONDARY = "#83C167" ACCENT = "#FFFF00" TITLE_SIZE = 48 BODY_SIZE = 30 LABEL_SIZE = 24 FAST = 0.8; NORMAL = 1.5; SLOW = 2.5 MONO = "Menlo" class Scene1_Introduction(Scene): def construct(self): self.camera.background_color = BG title = Text("Why Does This Work?", font_size=TITLE_SIZE, color=PRIMARY, weight=BOLD, font=MONO) self.play(Write(title), run_time=NORMAL) self.wait(1.0) self.play(FadeOut(title), run_time=0.5)每个场景还需满足 per-scene variation:主导色不同、布局不同、入场动画不同(在 Write / FadeIn / GrowFromCenter / Create 间轮换)、视觉密度有疏有密。
3. 渲染与检查阶段:rendering.md明确指出-ql(480p15)下文本字距与可读性明显变差——对文本密集场景,应在-qm(720p)下输出预览静帧检查字距与重叠,-ql只用于验证布局与节奏。渲染前按production-quality.md的 Pre-Render 清单逐项打勾:所有场景设置背景色、每次重要动画带add_subcaption()、无小于 18 的文本、无比例字体、所有.to_edge()的buff >= 0.5、场景结尾干净 FadeOut、揭示后self.wait()、全程使用颜色常量、统一渲染质量标志。
结语
视觉设计规范的终极目标,是让"第一次渲染就接近成片"。12 条原则回答"如何引导注意力",6 种布局模板回答"内容往哪放",3+1 套调色板回答"用什么颜色、为什么",等宽字体规则回答"文本为何必须如此",而逐帧自检清单把以上一切浓缩为 5 个可回答的问题。配合仓库中的 SKILL.md、animations.md、mobjects.md、production-quality.md等参考文档,即可在编码、渲染、审查全流程中稳定产出视觉统一、信息清晰的 Manim 动画。
- AI 技能/插件
- 音视频
- 视频处理
- 人工智能
【免费下载链接】video-use
Edit videos with coding agents
相关推荐
justfile 快速上手:8 个小节写完你的第一个任务脚本
justfile 快速上手:8 个小节写完你的第一个任务脚本 just 是一款命令运行器,把常用命令写进 justfile 变成食谱,一句 just build
CLI开发工具任务调度速查表视觉设计:Posit Cheatsheets中的配色与布局黄金法则
速查表视觉设计:Posit Cheatsheets中的配色与布局黄金法则 Posit速查表是R语言生态中不可或缺的视觉学习工具,其精心设计的配色方案和布局原则让
文档教程Bisq去中心化交易所:揭秘无需信任第三方的终极交易方案
Bisq去中心化交易所:揭秘无需信任第三方的终极交易方案 在数字货币交易领域,信任问题一直是用户面临的最大挑战。中心化交易所频繁发生的黑客攻击、资金冻结甚至跑路
区块链DeFi金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考