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

出界原因

  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())

相关推荐
曲径海盗4 小时前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门
Data_Journal4 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
我命由我123455 小时前
智能助手通用问答边界
人工智能·python·学习·ai·学习方法·ai编程·智能体
Angeldream1235 小时前
第 4 章 医学影像预处理
图像处理·人工智能·python·医学影像·医学影像处理
Web3&Basketball5 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
把我格子衫拿来5 小时前
医学影像重采样:spacing 改了,为什么模型位置也跟着错了?
python·dicom·医学影像·simpleitk·重采样
打工仔折腾 AI5 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
wuyk5556 小时前
PyQt6-第05讲-QtDesigner工作流与ui文件
python·ui·pyqt
Want5956 小时前
Python跳动的爱心②
开发语言·python·数学建模
田里的水稻6 小时前
PyTorch_TensorBoard展示
人工智能·pytorch·python·深度学习·神经网络