class ShowScreenResolution(Scene): def construct(self): pixel_height = config["pixel_height"] # 1080 is default pixel_width = config["pixel_width"] # 1920 is default frame_width = config["frame_width"] frame_height = config["frame_height"] self.add(Dot()) d1 = Line(frame_width * LEFT / 2, frame_width * RIGHT / 2).to_edge(DOWN) self.add(d1) self.add(Text(str(pixel_width)).next_to(d1, UP)) d2 = Line(frame_height * UP / 2, frame_height * DOWN / 2).to_edge(LEFT) self.add(d2) self.add(Text(str(pixel_height)).next_to(d2, RIGHT))
frame_width, frame_height和pixel_width, pixel_height有什么区别?
在 Manim 中,理解这两组概念的区别非常重要,这本质上是“物理世界”与“数字画布”之间的映射关系。
你可以把 Manim 想象成一个摄影棚:Frame 是摄影机镜头里看到的物理空间,而 Pixel 是最终导出的视频分辨率。
1. Pixel Width / Height (像素宽高)
这是指视频的分辨率,即最终生成的 .mp4 文件有多少个像素点。
-
单位:像素 (px)。
-
默认值:如果你设置
-qh(High Quality),它是1920 x 1080;如果是-ql(Low Quality),则是854 x 480。 -
作用:决定视频的清晰度。它不影响物体在场景中的相对位置,只影响画质。
2. Frame Width / Height (坐标系宽高)
这是 Manim 内部使用的虚拟单位(也叫 Manim Units)。
-
单位:Manim Unit (无单位数值)。
-
默认值:无论分辨率是多少,Manim 的
frame_height默认永远是 8.0。由于标准视频比例是 16:9,所以frame_width默认约为 14.22 ($8 \times \frac{16}{9}$)。 -
作用:决定物体的坐标布局。
-
ORIGIN是 $(0, 0, 0)$。 -
屏幕最上方是
4 * UP。 -
屏幕最下方是
4 * DOWN。
-
核心区别对比
| 特性 | Pixel (像素) | Frame (框架单位) |
| 范畴 | 数字化输出 / 硬件层面 | 数学坐标系 / 逻辑层面 |
| 代表属性 | 视频的精细程度 | 舞台的大小 |
| 变化规律 | 随渲染设置(-ql, -qh, -qk)改变 | 通常固定(默认高度为 8.0) |
| 计算公式 | 无 | frame_width = frame_height * aspect_ratio |
举个例子
假设你想画一个圆,占据屏幕高度的一半:
-
你应该设置
Circle(radius=2.0)。因为整个屏幕高度是8.0,半径为 2 的圆直径是 4,正好是高度的一半。 -
关键点:无论你导出的是 4K 视频还是 480p 视频,这个圆在屏幕上的相对大小永远不变。Manim 会自动计算如何将这 2.0 个单位转换成对应的像素数。
为什么代码中要用到它们?
在你提供的代码中:
-
Line(frame_width * LEFT / 2, frame_width * RIGHT / 2):这是利用逻辑单位画一条刚好填满屏幕宽度的线。 -
Text(str(pixel_width)):这是在告诉观众,这条填满屏幕宽度的线,在当前的渲染设置下,代表了多少个真实的像素点。
总结一句话:
Frame 让你像数学家一样思考布局(“把这个方块放在左边 3 个单位处”),而 Pixel 是在你按下导出键时,决定这张数学蓝图被画得有多精细。

浙公网安备 33010602011771号