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

相关推荐
索西引擎2 小时前
项目级 python 包管理工具 UV
python·uv
2401_827499992 小时前
python项目实战10-网络机器人01
开发语言·python
云程笔记5 小时前
004.环境搭建基础篇:Python、CUDA、cuDNN、PyTorch/TensorFlow安装与版本兼容性踩坑
pytorch·python·tensorflow
知行合一。。。10 小时前
Python--04--数据容器(总结)
开发语言·python
架构师老Y10 小时前
008、容器化部署:Docker与Python应用打包
python·容器·架构
lifewange11 小时前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest
pluvium2711 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
2401_8274999911 小时前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python
PD我是你的真爱粉11 小时前
MCP 协议详解:从架构、工作流到 Python 技术栈落地
开发语言·python·架构