manim边学边做--移动相机的场景类

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

Manim作为强大的数学动画引擎,其核心功能之一是实现复杂的镜头运动控制。
MovingCameraScene类正是为满意这种需求而设计的专业场景类。
与基础Scene类相比,它通过以下特性拓展了镜头控制本领:

  • 支持及时镜头移动、缩放和旋转
  • 提供更灵活的动画组合方式
  • 优化多对象运动时的镜头同步
本文主要介绍MovingCameraScene的作用、主要参数、方法,并通过应用示例来展示其强大功能。
1. MovingCameraScene概要

MovingCameraScene是 Manim 中的一个特殊场景类,继承自Scene。
它的核心功能是允许相机在动画中自由移动,与平凡的Scene类不同,MovingCameraScene提供了对相机位置、缩放和旋转的精致控制,让我们可以更灵活地展示动画内容。
这种灵活性在以下几种场景中尤为重要:

  • 聚焦特定对象:在复杂的动画中,可能需要将观众的留意力集中在某个特定的对象或区域上。  MovingCameraScene可以轻松实现相机的平移和缩放,资助突出重点
  • 动态视角切换:通过移动相机,创作者可以在不同的视角之间切换,为观众带来更丰富的视觉体验。比方,在展示一个3D模型时,可以通过旋转相机来展示模型的不同侧面
  • 创建动态效果:相机的移动可以用来创建一些特殊的动态效果,如推拉镜头、环绕镜头等,加强动画的视觉冲击力
1.1. 主要参数

MovingCameraScene的参数主要继承自Scene,一样平常不需要设置:
参数名称类型分析camera_classCamera指定相机的类型,默认为MovingCamera。这个参数允许创作者根据需要选择不同的相机类,从而实现不同的视觉效果。1.2. 主要方法

MovingCameraScene的主要方法:
名称分析get_moving_mobjects从传入的动画列表中提取所有正在移动的 Mobject 对象,用于后续镜头控制逻辑``2. 使用示例

为了更好地理解MovingCameraScene的强大功能,我们通过下面的示例来展示其在不同场景中的应用。
2.1. 聚焦特定对象

在这个示例中,我们创建了一个圆形和一个正方形,并通过self.camera.frame.move_to()方法将相机聚焦到圆形上。
然后,我们使用animate属性将相机平移到正方形上。
这种平移效果可以资助观众更好地关注到不同的对象。
  1. # 创建一个圆形和一个正方形
  2. circle = Circle(radius=1, color=BLUE)
  3. square = Square(side_length=2, color=RED)
  4. circle.shift(2 * LEFT)
  5. square.shift(2 * RIGHT)
  6. # 添加对象到场景
  7. self.add(circle, square)
  8. # 将相机聚焦到圆形上
  9. self.play(self.camera.frame.animate.move_to(circle))
  10. self.wait()
  11. # 将相机平移到正方形上
  12. self.play(self.camera.frame.animate.move_to(square))
复制代码

2.2. 环绕镜头效果

在这个示例中,我们创建了一个正方形,并通过rotate()方法让相机围绕Y轴旋转45°,从而创建了一个环绕镜头效果。
这种效果可以加强动画的动态感。
  1. # 创建一个圆形
  2. s = Square(side_length=2, color=BLUE)
  3. # 创建一个点,用于相机围绕其旋转
  4. d = Dot(LEFT, color=GREEN)
  5. self.add(s, d)
  6. # 创建环绕镜头动画
  7. self.play(self.camera.frame.animate.move_to(d.get_center()))
  8. self.play(self.camera.frame.animate.rotate(PI / 4, axis=Y_AXIS))
复制代码

2.3. 移动对象的相机跟随

在这个示例中,我们创建了一个移动的点,并让相机跟随点的移动。
通过animate属性和move_to()方法,相机可以及时跟踪点的位置,从而实现相机跟随的效果。
  1. # 创建一个移动路径
  2. path = Line(
  3.     LEFT * 3,
  4.     RIGHT * 3,
  5.     path_arc=PI / -2,
  6.     color=YELLOW,
  7.     stroke_width=1,
  8. )
  9. # 创建一个移动的点
  10. dot = Dot(color=RED, point=LEFT * 3)
  11. self.play(Create(dot), Create(path))
  12. self.wait(0.5)
  13. self.camera.frame.save_state()
  14. self.play(self.camera.frame.animate.move_to(dot))
  15. # 让相机跟随点移动
  16. def update_camera(mob):
  17.     mob.move_to(dot.get_center())
  18. self.camera.frame.add_updater(update_camera)
  19. # 让点沿着路径移动
  20. self.play(MoveAlongPath(dot, path))
  21. self.camera.frame.remove_updater(update_camera)
  22. self.play(Restore(self.camera.frame))
复制代码

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(moving.py),
下载地点: 完整代码 (访问密码: 6872)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表