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

Manim作为强大的数学动画引擎,其核心功能之一是实现复杂的镜头运动控制。

MovingCameraScene类正是为满足这种需求而设计的专业场景类。

与基础Scene类相比,它通过以下特性拓展了镜头控制能力:

  • 支持实时镜头移动、缩放和旋转
  • 提供更灵活的动画组合方式
  • 优化多对象运动时的镜头同步

本文主要介绍MovingCameraScene的作用、主要参数、方法,并通过应用示例来展示其强大功能。

1. MovingCameraScene概要

MovingCameraScene是 Manim 中的一个特殊场景类,继承自Scene。

它的核心功能是允许相机在动画中自由移动,与普通的Scene类不同,MovingCameraScene提供了对相机位置、缩放和旋转的精细控制,让我们可以更灵活地展示动画内容。

这种灵活性在以下几种场景中尤为重要:

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

1.1. 主要参数

MovingCameraScene的参数主要继承自Scene,一般不需要设置:

参数名称 类型 说明
camera_class Camera 指定相机的类型,默认为MovingCamera。这个参数允许创作者根据需要选择不同的相机类,从而实现不同的视觉效果。

1.2. 主要方法

MovingCameraScene的主要方法:

名称 说明
get_moving_mobjects 从传入的动画列表中提取所有正在移动的 Mobject 对象,用于后续镜头控制逻辑``

2. 使用示例

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

2.1. 聚焦特定对象

在这个示例中,我们创建了一个圆形 和一个正方形 ,并通过self.camera.frame.move_to()方法将相机聚焦到圆形上。

然后,我们使用animate属性将相机平移到正方形上。

这种平移效果可以帮助观众更好地关注到不同的对象。

python 复制代码
# 创建一个圆形和一个正方形
circle = Circle(radius=1, color=BLUE)
square = Square(side_length=2, color=RED)
circle.shift(2 * LEFT)
square.shift(2 * RIGHT)

# 添加对象到场景
self.add(circle, square)

# 将相机聚焦到圆形上
self.play(self.camera.frame.animate.move_to(circle))
self.wait()

# 将相机平移到正方形上
self.play(self.camera.frame.animate.move_to(square))

2.2. 环绕镜头效果

在这个示例中,我们创建了一个正方形,并通过rotate()方法让相机围绕Y轴旋转45°,从而创建了一个环绕镜头效果。

这种效果可以增强动画的动态感。

python 复制代码
# 创建一个圆形
s = Square(side_length=2, color=BLUE)

# 创建一个点,用于相机围绕其旋转
d = Dot(LEFT, color=GREEN)
self.add(s, d)

# 创建环绕镜头动画
self.play(self.camera.frame.animate.move_to(d.get_center()))
self.play(self.camera.frame.animate.rotate(PI / 4, axis=Y_AXIS))

2.3. 移动对象的相机跟随

在这个示例中,我们创建了一个移动的点,并让相机跟随点的移动。

通过animate属性和move_to()方法,相机可以实时跟踪点的位置,从而实现相机跟随的效果。

python 复制代码
# 创建一个移动路径
path = Line(
    LEFT * 3,
    RIGHT * 3,
    path_arc=PI / -2,
    color=YELLOW,
    stroke_width=1,
)

# 创建一个移动的点
dot = Dot(color=RED, point=LEFT * 3)
self.play(Create(dot), Create(path))
self.wait(0.5)
self.camera.frame.save_state()
self.play(self.camera.frame.animate.move_to(dot))

# 让相机跟随点移动
def update_camera(mob):
    mob.move_to(dot.get_center())

self.camera.frame.add_updater(update_camera)

# 让点沿着路径移动
self.play(MoveAlongPath(dot, path))
self.camera.frame.remove_updater(update_camera)

self.play(Restore(self.camera.frame))

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(moving.py),

下载地址: 完整代码 (访问密码: 6872)

相关推荐
砚底藏山河11 小时前
python量化入门:多周期数据对齐统一时间轴
java·数据库·python·金融·maven
毕业设计70312 小时前
(免费领源码)django空气净化器销售系统09218- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·scrapy·mysql·pycharm·django·flask·pandas
小小张说故事12 小时前
Python 闭包到底捕获了啥?一个计数器例子讲透,别再背定义了
python
深蓝AI12 小时前
AI Agent 点了发布却超时:一条回执丢失,为什么能造成两篇文章?
人工智能·python
怪奇云呼军12 小时前
教育试听预约后没到课,闪电智能 Voice Agent 如何做分层回访?
人工智能·python·算法·云计算·音视频
weixin1997010801613 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
梦想的颜色13 小时前
【编程实战】AI 时代 APP 开发全栈硬核指南:技术选型 + AI 架构 + 模型落地全维度决策
python·flutter·react native·react.js·ai·桌面应用·milvus
Madison-No713 小时前
多语言聊天大模型--测试报告
linux·git·python·selenium·jmeter·自动化·postman
鲲鹏ai13 小时前
盈启鲲鹏数字人招商政策
大数据·人工智能·python
荣码13 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python