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属性将相机平移到正方形上。
这种平移效果可以帮助观众更好地关注到不同的对象。
# 创建一个圆形和一个正方形
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°,从而创建了一个环绕镜头效果。
这种效果可以增强动画的动态感。
# 创建一个圆形
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()方法,相机可以实时跟踪点的位置,从而实现相机跟随的效果。
# 创建一个移动路径
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)
manim边学边做--移动相机的场景类的更多相关文章
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- 使用jmeter做简单的场景设计
使用jmeter做简单的场景设计 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.我之所以选择它,最重要的一点就是----开源 个人 ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Release释放操作
☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_OfflineOnlyCharging_Release消息交互流程 Nchf_OfflineOnlyCharging_Release是CHF提供 ...
- 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Update 更新操作过程
☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_OfflineOnlyCharging_Update消息交互过程 Nchf_OfflineOnlyCharging_Update消息是是5G融合 ...
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继 ...
- [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)
场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...
- [置顶] 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12708811 场景类CCScene和布景类CCLayer都是作为一个容器来使 ...
随机推荐
- DDD你真的理解清楚了吗?怎么准确理解“值对象”
这些年,随着软件业的不断发展,软件系统开始变得越来越复杂而难于维护.这时,越来越多的开发团队开始选择实践DDD领域驱动设计.领域驱动设计是一种非常优秀的软件设计思想,它可以非常好地帮助我们梳理复杂业务 ...
- Qt编写地图综合应用60-覆盖物坐标和搜索
一.前言 地图应用中有时候需要开启悬浮工具栏,用户可以直接在地图上绘制矩形.多边形.圆形.线条等,于是需要提供一个函数接口,能够获取到用户绘制的这些图形形状对应的信息.比如坐标点.圆形的中心点和半径. ...
- Qt编写安防视频监控系统66-子模块10网页浏览
一.前言 网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个.此模块的用途属于添砖加瓦润色用的,比如有一个牛逼的3D网页,机器人. ...
- Qt开源作品26-通用按钮地图效果
一.前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜 ...
- 在Win7 x64环境中将World Wind Java SDK 2.1.0嵌入到Eclipse中的方法
1.解压worldwind-2.1.0.zip. 2.打开Eclipse,依次点击New–>Java project ,输入project的名称WorldWind,一路直到finish.然后就可 ...
- functional-requirement
功能需求 基于GeoServer现有功能,以地图展示和服务管理为核心,实现一张图DEMO. 1. 地图展示 树状展示各种地图服务,并以地图的形式展示出来. 2. 服务管理 树状管理各种地图服务,包括添 ...
- SpringBoot集成MinIO8.3.x 依赖冲突解决,至简之招覆盖spring-boot-dependencies的依赖版本声明
版本声明 SpringBoot 2.6.5 MinIO 8.3.7 报错信息 An attempt was made to call a method that does not exist. The ...
- MyBatis中的 10 个宝藏技巧!
前言 说到 MyBatis,很多小伙伴都会用,但未必用得"惊艳". 实际上,这个轻量级的持久层框架还有很多隐藏的"宝藏技巧". 如果你能掌握这些技巧,不但能让开 ...
- ORACLE存储过程,函数,包,游标
1. PL/SQL语句块PL/SQL语句块只适用于Oracle数据库,使用时临时保存在客户端,而不是保存在数据库.基本语法: declare 变量声明.初始化 begin 业务处理.逻辑代码 exc ...
- Mac安装NTL库
Mac安装NTL库 NTL是一个高性能.可移植的C++库,为任意长度的整数提供数据结构和算法:用于整数和有限域上的向量.矩阵和多项式:以及任意精度的浮点运算. 具有以下功能: 任意长度整数运算和任意精 ...