首页 > 解决方案 > 在 manim 3b1b 库中放大图形的一部分背后的逻辑是什么?

问题描述

在使用 manim 的 3b1b 视频中,作者显示了一个放大图的一部分的框,他是如何实现的?

标签: pythonmanim

解决方案


看到这个,代码示例是:

class ZoomedSceneExample(ZoomedScene):
CONFIG = {
    "zoom_factor": 0.3,
    "zoomed_display_height": 1,
    "zoomed_display_width": 6,
    "image_frame_stroke_width": 20,
    "zoomed_camera_config": {
        "default_frame_stroke_width": 3,
    },
}

def construct(self):
    # Set objects
    dot = Dot().shift(UL*2)

    image=ImageMobject(np.uint8([[ 0, 100,30 , 200],
                                 [255,0,5 , 33]]))
    image.set_height(7)
    frame_text=TextMobject("Frame",color=PURPLE).scale(1.4)
    zoomed_camera_text=TextMobject("Zommed camera",color=RED).scale(1.4)

    self.add(image,dot)

    # Set camera
    zoomed_camera = self.zoomed_camera
    zoomed_display = self.zoomed_display
    frame = zoomed_camera.frame
    zoomed_display_frame = zoomed_display.display_frame

    frame.move_to(dot)
    frame.set_color(PURPLE)

    zoomed_display_frame.set_color(RED)
    zoomed_display.shift(DOWN)

    # brackground zoomed_display
    zd_rect = BackgroundRectangle(
        zoomed_display,
        fill_opacity=0,
        buff=MED_SMALL_BUFF,
    )

    self.add_foreground_mobject(zd_rect)

    # animation of unfold camera
    unfold_camera = UpdateFromFunc(
        zd_rect,
        lambda rect: rect.replace(zoomed_display)
    )

    frame_text.next_to(frame,DOWN)

    self.play(
        ShowCreation(frame),
        FadeInFromDown(frame_text)
    )

    # Activate zooming
    self.activate_zooming()

    self.play(
        # You have to add this line
        self.get_zoomed_display_pop_out_animation(),
        unfold_camera
    )

    zoomed_camera_text.next_to(zoomed_display_frame,DOWN)
    self.play(FadeInFromDown(zoomed_camera_text))

    # Scale in     x   y  z
    scale_factor=[0.5,1.5,0]

    # Resize the frame and zoomed camera
    self.play(
        frame.scale,                scale_factor,
        zoomed_display.scale,       scale_factor,
        FadeOut(zoomed_camera_text),
        FadeOut(frame_text)
    )

    # Resize the frame
    self.play(
        frame.scale,3,
        frame.shift,2.5*DOWN
    )

    # Resize zoomed camera
    self.play(
        ScaleInPlace(zoomed_display,2)
    )


    self.wait()

    self.play(
        self.get_zoomed_display_pop_out_animation(),
        unfold_camera,
        # -------> Inverse
        rate_func=lambda t: smooth(1-t),
    )
    self.play(
        Uncreate(zoomed_display_frame),
        FadeOut(frame),
    )
    self.wait()

推荐阅读