ZhangZhihui's Blog  

 

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 是在你按下导出键时,决定这张数学蓝图被画得有多精细。

 

posted on 2026-05-14 10:38  ZhangZhihuiAAA  阅读(38)  评论(0)    收藏  举报