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。