科普: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())

相关推荐
别走!万哥爱你5 小时前
Python 中可以用于在已排序的列表中查找特定元素的位置的是什么?
python
wxwx_bscxy3226 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
TechWayfarer6 小时前
Cloudflare 9·15新政倒计时:用IP风险画像识别AI爬虫,防止误伤Googlebot
网络·人工智能·爬虫·python·tcp/ip·网络安全
禹凕7 小时前
滑动窗口算法实战指南
python·算法
论文复现现场7 小时前
RTX 4090 24GB 能跑 Qwen3.8-27B 吗?单卡显存计算与云端部署指南
人工智能·python·云计算·llama·gpu算力
Patrick在香港7 小时前
模型路由器实测:12 个任务省 77%,旗舰过载时的降级要打出显式标记
python·llm·智能路由器·api·架构设计·成本优化
Looooking8 小时前
Python 之 jwt 令牌生成和校验
python·jwt
2601_962295999 小时前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源
菜鸡66669 小时前
绕过cf验证,部署 FlareSolverr 服务使用request处理
python·cloudflare
前端 贾公子9 小时前
第10章:RAG(2)
开发语言·python