Manim视频尺寸和坐标系统

1. 视频宽度与高度

ManimConfig用字典存储了所有配置选项,跟大小有关的选项有:

pixel_width = config["pixel_width"]     # 1920 is default
pixel_height = config["pixel_height"]   # 1080 is default
aspect_ratio = config['aspect_ratio']   # 1920/1080 = 1.7777777777777777
frame_width = config["frame_width"]     # 8.0 * 1.777 = 14.222
frame_height = config["frame_height"]   # 8.0
media_width = config['media_width']     # 60%
window_size                             # default
zero_pad                                # 4

默认情况下,整个视频的宽度为14.2,高度为8.0,一个单位指1

2. 位置

2.1 坐标系统

整个画布的中央作为坐标系统的原点,np.array([0., 0., 0.])

ORIGIN: np.ndarray = np.array((0.0, 0.0, 0.0))
"""The center of the coordinate system."""

写一小段代码,画出坐标轴:

from manim import *

frame_width = config.frame_width
frame_height = config.frame_height

class Test(Scene):
    def construct(self):
        # self.wait(1)
        legend = Text('frame_width = {}\nframe_height = {}'.format(round(frame_width, 2), frame_height), font_size=20)
        self.add(legend.to_corner(UR))

        # coordinate system
        line1 = Line(frame_width * LEFT, frame_width * RIGHT)
        line2 = Line(frame_height * UP, frame_height * DOWN)
        self.add(line1, line2)

        for i in range(-10, 10):
            if i == 0:
                continue

            # x axis
            dot = Dot(np.array([i, 0, 0]), color=YELLOW)
            text = Text('{}'.format(i), font_size=20, color=YELLOW).next_to(dot, DOWN)
            self.add(dot, text)

            # y axis
            dot = Dot(np.array([0, i, 0]), color=RED)
            text = Text('{}'.format(i), font_size=20, color=RED).next_to(dot)
            self.add(dot, text)

可以得到下图:

manim coordinate system

2.2 一些距离常量

manim/constants.py定义了一些常量。LEFT, RIGHT; UP, DOWN; IN, OUT分别表示在XYZ轴上移动一个单位距离,如:

# One unit step in the positive Y direction.
UP: np.ndarray = np.array((0.0, 1.0, 0.0))

UP         == np.array([0, 1, 0])
DOWN     == np.array([0, -1, 0])
LEFT     ==  np.array([-1, 0, 0])
RIGHT     == np.array([1, 0, 0])

除此之外,还定义了常量ULURDLDR,分别表示上左、上右、下左、下右。

UL        == np.array([-1, 1, 0])
DL         == np.array([-1, -1, 0])
UR         == np.array([1, 1, 0])
DR         == np.array([1, -1, 0])

2.3 内边距(padding)

比如to_edgeto_corner默认的padding为0.5next_to默认的padding为0.25

to_corner(self, corner=LEFT + DOWN, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER)
to_edge(self, edge=LEFT, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER)

DEFAULT_MOBJECT_TO_EDGE_BUFFER: float = MED_LARGE_BUFF
MED_LARGE_BUFF: float = 0.5

更多常量见contants.py

# Default buffers (padding)
SMALL_BUFF: float = 0.1
MED_SMALL_BUFF: float = 0.25
MED_LARGE_BUFF: float = 0.5
LARGE_BUFF: float = 1
DEFAULT_MOBJECT_TO_EDGE_BUFFER: float = MED_LARGE_BUFF
DEFAULT_MOBJECT_TO_MOBJECT_BUFFER: float = MED_SMALL_BUFF

3. 指定对象的位置

指定对象的位置,可以用绝对位置,也可以用相对位置。

3.1 绝对位置

通过三维坐标np.array([x, y, z])指定对象的位置,如:点Dot,参数point指定了点的位置,默认是坐标原点,即np.array([0., 0., 0.])

class Dot(point=array([0., 0., 0.]), radius=0.08, stroke_width=0, fill_opacity=1.0, color='#FFFFFF', **kwargs)[source]

3.2 相对位置

以另一个对象为参照物,指定一个对象的位置,通过next_to指定,direction可以是LEFT, RIGHT; UP, DOWN

# Move this Mobject next to another’s Mobject or coordinate.
next_to(mobject_or_point, direction=array([1., 0., 0.]), buff=0.25, aligned_edge=array([0., 0., 0.]), submobject_to_align=None, index_of_submobject_to_align=None, coor_mask=array([1, 1, 1]))

align_to可以向另一个对象对齐:

# Aligns mobject to another Mobject in a certain direction
align_to(mobject_or_point, direction=array([0., 0., 0.]), alignment_vect=array([0., 1., 0.]))

# Examples
# 左侧对齐
mob1.align_to(mob2, LEFT) 
# moves mob1 horizontally so that it’s center is directly above/below the center of mob2
mob1.align_to(mob2, alignment_vect = RIGHT)
本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-02-26 22:15

results matching ""

    No results matching ""