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都是作为一个容器来使 ...
随机推荐
- debian/ubuntu系统vi无法删除字符的解决办法
之前在 Linux 下操作,一直使用的是 Centos 系统,使用 vi 编辑命令一直很顺畅. 最近,入手了一台 debian 操作系统的 vps.在操作 vi 命令时,发现当输入 i 要进行文件编辑 ...
- Windows 记录开机后应用启动慢的问题
最近大屏产品经常报一些开机启动的问题,工厂反馈厂测软件有些模块测试不通过,家里开发测试均发现Launcher等软件首次启动需要加载10多秒. 经过小伙伴们排查,发现是刷母盘后首次开机问题概率比较大.使 ...
- 【Rive】眼睛互动动画
1 前言 本文基于 Rive 社区开放的眼睛动画,进一步加工处理,实现更有趣的眼睛互动动画. 原始资源见 → Eye Joysticks Demo,效果如下. 原始资源只有一只眼睛,并且没 ...
- Fastadmin框架,服务器搭建环境
FastAdmin 基于ThinkPHP和Bootstrap的极速后台开发框架 https://www.fastadmin.net 安装node.js 1.获取node.js资源 V8.x: curl ...
- Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图
一.前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有.无论哪个地图厂家,提供的接口都是没 ...
- Android RNDIS gadget Windows免驱修改方案
过程简单粗暴,拿到竞品的设备,然后使用UsbTreeView查看设备的相关描述符. 对比发现接口抽象描述符和接口描述符不一致,直接修改Linux RNDIS gadget 驱动,将驱动中有关的两个描述 ...
- Dynaimc CRM查找字段自定义过滤视图
实现方式参考官方文档提供的Xrm.Page.getControl(arg).addCustomView(viewId, entityName, viewDisplayName, fetchXml, l ...
- SpringBoot 集成腾讯云(对象存储、短信)
https://developer.aliyun.com/article/831473 https://blog.csdn.net/weixin_45626288/article/details/11 ...
- 第六章 ArrayBlockingQueue源码解析
1.对于ArrayBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 public ArrayBlockingQueue(int capacity, boo ...
- 深度学习基础理论————CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等)以及代码
主要介绍在CV中常用的Backbone原理简易代码(代码以及原理经常更新),参考论文中的表格,对不同的任务所使用的backbone如下: 针对上面内容分为两块内容:1.基于卷积神经网络的CV Back ...