科普:Manim 的显示范围问题

张开发
2026/5/21 1:28:55 15 分钟阅读
科普:Manim 的显示范围问题
Manim 的显示范围问题1. config.frame 正确设置全局分辨率 16:9✅ 标准设置frommanimimport*# 【全局写在最前面】固定 16:9 横屏config.frame_size(1920,1080)# 窗口大小config.frame_height8# 固定高度config.frame_width14.22# 固定宽度标准值(1920, 1080)→ 单位是像素pixel8和14.22→ 单位是Manim 内部坐标系单位Manim Unit像素屏幕单位config.frame_size(1920,1080)这是视频/窗口的分辨率单位像素 px决定画面有多清晰Manim Unit坐标系单位config.frame_height8config.frame_width14.22这是Manim 内部数学坐标系的范围没有物理单位不是厘米、不是毫米、不是像素你可以把它理解成“逻辑单位”、“格子单位”直观解释frame_height 8→ 你的屏幕竖直方向一共能放下 8 个单位frame_width 14.22→ 你的屏幕水平方向一共能放下 14.22 个单位竖轴 8 单位 → 填满 1080 像素高度横轴 14.22 单位 → 填满 1920 像素宽度保持16:9 比例画面不变形写代码时怎么用在 Manim 里写的所有坐标、大小全部用 Manim UnitSquare(side_length2)# 占 2 个坐标系单位Dot().move_to(UP*2)# 向上移动 2 个单位和像素毫无关系✅ 运行时修改视野瞬间切换self.camera.frame_width10# 视野变窄 → 内容变大self.wait(2)self.camera.frame_width20# 视野变宽 → 内容变小self.wait(2)❌ 绝对不能写社区版不支持self.camera.animate.set_frame_width()# 报错self.camera.frame_width.animate# 报错2. 内容出界问题出界原因只改frame_width不改高度破坏 16:9 比例。或者反过来。物体太大、位置太偏✅ 解决方法# 方法1保持标准 14.22 / 8config.frame_width14.22config.frame_height8# 方法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 设置会怎样假设你乱设config.frame_width10config.frame_height10# 正方形比例 1:1但窗口是1920×108016:9结果Manim 会强行把正方形的坐标系拉宽成 16:9 的长方形圆形 → 变成椭圆正方形 → 变成长方形文字 →被压扁/拉扁你的内容 →看起来变形、出界改成 28.44 : 16 也可以28.44 / 16 1.777... 16/9比例没变只是视野变大了物体看起来变小了但完全不变形、不出界、不竖屏所以 28.44 : 16 也可以当然其它数只要保持 16:9 比例就可以。3. 物体大小缩放.scale()瞬间缩放✅ 直接缩放无动画立刻变大变小texMathTex(rx^2 y^2 z^2)tex.scale(1.5)# 变大 1.5 倍tex.scale(0.8)# 缩小到 0.8 倍✅ 一组物体一起缩放groupVGroup(tex,txt,square)group.scale(2)# 全部一起放大4. 平滑动画缩放.animate.scale()✅ 带动画的平滑缩放# 放大动画self.play(tex.animate.scale(1.5),run_time1)# 缩小动画self.play(tex.animate.scale(0.5),run_time1)✅ 一组物体一起平滑缩放groupVGroup(tex,txt,square)self.play(group.animate.scale(2),run_time2) 示例模板frommanimimport*# 1. 全局标准配置 config.frame_size(1920,1080)config.frame_height8config.frame_width14.22classFinalDemo(Scene):defconstruct(self):# 创建物体texMathTex(r\int_0^\infty e^{-x}dx 1)txtText(测试文字)sqSquare()# 排列groupVGroup(tex,txt,sq).arrange(DOWN)self.add(group)self.wait(1)# 2. 平滑缩放动画 self.play(group.animate.scale(1.5),run_time1.5)self.wait(1)# 3. 瞬间改视野 self.camera.frame_width10self.wait(1)self.camera.frame_width20self.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())

更多文章