Manim 的显示范围问题
1. config.frame 正确设置(全局分辨率 16:9)
✅ 标准设置
python
from manim import *
# 【全局写在最前面】固定 16:9 横屏
config.frame_size = (1920, 1080) # 窗口大小
config.frame_height = 8 # 固定高度
config.frame_width = 14.22 # 固定宽度(标准值)
(1920, 1080)→ 单位是:像素(pixel)8和14.22→ 单位是:Manim 内部坐标系单位(Manim Unit)
像素(屏幕单位)
python
config.frame_size = (1920, 1080)
- 这是视频/窗口的分辨率
- 单位:像素 px
- 决定画面有多清晰
Manim Unit(坐标系单位)
python
config.frame_height = 8
config.frame_width = 14.22
- 这是 Manim 内部数学坐标系 的范围
- 没有物理单位,不是厘米、不是毫米、不是像素
- 你可以把它理解成:"逻辑单位"、"格子单位"
直观解释:
-
frame_height = 8→ 你的屏幕竖直方向,一共能放下 8 个单位
-
frame_width = 14.22→ 你的屏幕水平方向,一共能放下 14.22 个单位
-
竖轴 8 单位 → 填满 1080 像素高度
-
横轴 14.22 单位 → 填满 1920 像素宽度
-
保持 16:9 比例,画面不变形
写代码时怎么用?
在 Manim 里写的所有坐标、大小,全部用 Manim Unit:
python
Square(side_length=2) # 占 2 个坐标系单位
Dot().move_to(UP*2) # 向上移动 2 个单位
和像素毫无关系!
✅ 运行时修改视野(瞬间切换)
python
self.camera.frame_width = 10 # 视野变窄 → 内容变大
self.wait(2)
self.camera.frame_width = 20 # 视野变宽 → 内容变小
self.wait(2)
❌ 绝对不能写(社区版不支持)
python
self.camera.animate.set_frame_width() # 报错!
self.camera.frame_width.animate # 报错!
2. 内容出界问题
出界原因
- 只改
frame_width,不改高度,破坏 16:9 比例。或者反过来。 - 物体太大、位置太偏
✅ 解决方法
python
# 方法1:保持标准 14.22 / 8
config.frame_width = 14.22
config.frame_height = 8
# 方法2:物体自动适应屏幕
obj.scale_to_fit_width(12) # 缩放到宽度 12,永不越界
obj.center() # 放在画面中间
关于16:9
不是 Manim 强迫你必须 16:9,而是你的屏幕/视频是 16:9!
- 你的 Windows 屏幕是 16:9
- 你渲染的视频默认 1920×1080 = 16:9
- 所以 Manim 必须把画面按 16:9 填满
如果你不按 16:9 设置会怎样?
假设你乱设:
python
config.frame_width = 10
config.frame_height = 10 # 正方形比例 1:1
但窗口是 1920×1080(16:9)
结果:
Manim 会强行把正方形的坐标系,拉宽成 16:9 的长方形!
- 圆形 → 变成椭圆
- 正方形 → 变成长方形
- 文字 → 被压扁/拉扁
- 你的内容 → 看起来变形、出界
改成 28.44 : 16 也可以?
28.44 / 16 = 1.777... = 16/9
比例没变!
- 只是视野变大了
- 物体看起来变小了
- 但完全不变形、不出界、不竖屏
所以, 28.44 : 16 也可以
当然,其它数,只要保持 16:9 比例就可以。
3. 物体大小缩放:.scale()(瞬间缩放)
✅ 直接缩放(无动画,立刻变大变小)
python
tex = MathTex(r"x^2 + y^2 = z^2")
tex.scale(1.5) # 变大 1.5 倍
tex.scale(0.8) # 缩小到 0.8 倍
✅ 一组物体一起缩放
python
group = VGroup(tex, txt, square)
group.scale(2) # 全部一起放大
4. 平滑动画缩放:.animate.scale()
✅ 带动画的平滑缩放
python
# 放大动画
self.play(tex.animate.scale(1.5), run_time=1)
# 缩小动画
self.play(tex.animate.scale(0.5), run_time=1)
✅ 一组物体一起平滑缩放
python
group = VGroup(tex, txt, square)
self.play(group.animate.scale(2), run_time=2)
🔥 示例模板
python
from manim import *
# ========== 1. 全局标准配置 ==========
config.frame_size = (1920, 1080)
config.frame_height = 8
config.frame_width = 14.22
class FinalDemo(Scene):
def construct(self):
# 创建物体
tex = MathTex(r"\int_0^\infty e^{-x}dx = 1")
txt = Text("测试文字")
sq = Square()
# 排列
group = VGroup(tex, txt, sq).arrange(DOWN)
self.add(group)
self.wait(1)
# ========== 2. 平滑缩放动画 ==========
self.play(group.animate.scale(1.5), run_time=1.5)
self.wait(1)
# ========== 3. 瞬间改视野 ==========
self.camera.frame_width = 10
self.wait(1)
self.camera.frame_width = 20
self.wait(1)
# ========== 4. 瞬间缩放 ==========
group.scale(0.5)
self.wait(1)
🎯 要点
config.frame必须 16:9 → 例如:宽 14.22 / 高 8- 出界就用
scale_to_fit_width() - 瞬间缩放 =
obj.scale() - 平滑动画缩放 =
self.play(obj.animate.scale())