科普:Manim 的显示范围问题

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)
  • 814.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. 内容出界问题

出界原因

  1. 只改 frame_width不改高度,破坏 16:9 比例。或者反过来。
  2. 物体太大、位置太偏

✅ 解决方法

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)

🎯 要点

  1. config.frame 必须 16:9 → 例如:宽 14.22 / 高 8
  2. 出界就用 scale_to_fit_width()
  3. 瞬间缩放 = obj.scale()
  4. 平滑动画缩放 = self.play(obj.animate.scale())

相关推荐
IT知识分享41 分钟前
从零开发在线简繁转换工具:OpenCC 实战、避坑经验与方案选型
javascript·python
lunzi_08261 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
杨运交1 小时前
[030][Web模块]Spring Boot 验证与 OpenAPI 集成实战:从校验规则到文档生成
前端·spring boot·python
培培说证1 小时前
2026财务岗位如何快速提升自身能力
python
努力攻坚操作系统1 小时前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
godspeed_lucip2 小时前
LLM和Agent——专题6:Multi Agent 入门(5)
人工智能·python
Metaphor6922 小时前
使用 Python 给 PDF 设置背景色或背景图
数据库·python·pdf
郝亚军3 小时前
如何让pycharm-2026.1.2顶部菜单栏固定显示在最上端
python
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode