1.相机的移动(MovingCameraScene
)
MovingCameraScene
是 Manim 中的一个类,用于创建可以移动的相机场景。这个类继承自 Scene
,并提供了关于相机移动的额外功能。
MovingCameraScene(camera_class=<class 'manim.camera.moving_camera.MovingCamera'>,
**kwargs)
参数解释:
camera_class
: 这是一个类,指定相机的类型。MovingCamera
是 Manim 中的一个类,允许相机在场景中平移和旋转。**kwargs
: 这是一个可变参数,可以传递给基类Scene
的构造函数,允许用户自定义其他一些场景参数。
以下是一个使用 MovingCameraScene
的基本示例,包括实例化并使用相机移动的简单代码,注释解释了每一部分的功能。
from manim import * class MyMovingCameraScene(MovingCameraScene): def construct(self): # 创建一个场景中的文本 text = Text("Hello, Manim!").shift(2*DOWN) # 将文本添加到场景中 self.add(text) # 确保相机开始时聚焦于文本 self.camera.frame.save_state() # 移动相机并进行动画 self.play(self.camera.frame.animate.move_to([0,0,0])) # 添加一些额外元素来显示相机移动效果 square = Square(color=BLUE).move_to([-4,2,0]) self.add(square) # 将相机视图移动到新位置 self.play(self.camera.frame.animate.move_to([2,2,0])) # 恢复相机到初始位置 self.play(self.camera.frame.animate.restore())
实例2;放大相机
class ChangingCameraWidthAndRestore(MovingCameraScene): def construct(self): text = Text("Hello World").set_color(BLUE) text01 = Text("setep1").set_color(BLUE).shift(2 * UP) # 添加文本到场景中 self.add(text01) # 只添加 text01,不改变它的状态 self.add(text) # 添加并保持 text # 保存相机的状态 self.camera.frame.save_state() # 放大 text 的视图,改变相机宽度 self.play(self.camera.frame.animate.set(width=text.width * 2)) self.wait(0.3) # 恢复相机的状态 self.play(Restore(self.camera.frame)) self.wait(0.3) # 再次改变相机宽度,但保持 text01 的大小不变 self.play(self.camera.frame.animate.set(width=text.width * 0.5)) self.wait(0.3) # 最后恢复到初始状态 self.play(Restore(self.camera.frame))
运行结果都会发生的事情就是,场面放什么,他都一起放大和移动。
实例3:移动相机
from manim import *class MovingCameraCenter(MovingCameraScene):def construct(self):s = Square(color=RED, fill_opacity=0.5).move_to(2 * LEFT)t = Triangle(color=GREEN, fill_opacity=0.5).move_to(2 * RIGHT)self.wait(0.3)self.add(s, t)self.play(self.camera.frame.animate.move_to(s))self.wait(0.3)self.play(self.camera.frame.animate.move_to(t))
实例4:先放大,再移动。
from manim import *class MovingAndZoomingCamera(MovingCameraScene):def construct(self):s = Square(color=BLUE, fill_opacity=0.5).move_to(2 * LEFT)t = Triangle(color=YELLOW, fill_opacity=0.5).move_to(2 * RIGHT)self.add(s, t)self.play(self.camera.frame.animate.move_to(s).set(width=s.width*2))self.wait(0.3)self.play(self.camera.frame.animate.move_to(t).set(width=t.width*2))self.play(self.camera.frame.animate.move_to(ORIGIN).set(width=14))
实例5:
from manim import *class MovingCameraOnGraph(MovingCameraScene):def construct(self):self.camera.frame.save_state()ax = Axes(x_range=[-1, 10], y_range=[-1, 10])graph = ax.plot(lambda x: np.sin(x), color=WHITE, x_range=[0, 3 * PI])dot_1 = Dot(ax.i2gp(graph.t_min, graph))dot_2 = Dot(ax.i2gp(graph.t_max, graph))self.add(ax, graph, dot_1, dot_2)self.play(self.camera.frame.animate.scale(0.5).move_to(dot_1))self.play(self.camera.frame.animate.move_to(dot_2))self.play(Restore(self.camera.frame))self.wait()
2.获取在特定动画过程中移动的物体
get_moving_mobjects(*animations)
是 Manim 中的一个辅助函数,主要用于获取在特定动画过程中移动的物体。它会分析传入的动画对象,并返回这些动画中涉及的移动物体的列表。
参数解释:
*animations
: 这是一个可变参数,允许传入多个动画对象。函数将逐个检查这些动画,确定哪些物体因这些动画而发生了位置变化。
代码示例:
下面是一个示例代码,展示了如何使用 get_moving_mobjects
函数。注释部分解释了每个步骤的功能。
from manim import * class MovingObjectsExample(Scene): def construct(self): # 创建两个文本对象 text1 = Text("Moving Text 1",color=RED).shift(LEFT * 3+UP) text2 = Text("Moving Text 2",color=BLUE).shift(RIGHT * 3+DOWN) # 将对象添加到场景中 self.add(text1, text2) # 定义动画,将第一个文本向右移动,将第3个文本向左移动 animation1 = text1.animate.shift(RIGHT * 3) animation2 = text2.animate.shift(LEFT * 3) # 获取所有移动的物体 moving_objects = self.get_moving_mobjects(animation1, animation2) # 播放动画 self.play(animation1, animation2) def get_moving_mobjects(self, *animations): # 使用 get_moving_mobjects 函数来获取在动画过程中移动的物体 return super().get_moving_mobjects(*animations)
想看详细的视频,可以在资源里面自行下载观看ChangingCameraWidthAndRestore.zip。