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边学边做--移动相机的场景类的更多相关文章

  1. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  2. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  3. 使用jmeter做简单的场景设计

    使用jmeter做简单的场景设计 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.我之所以选择它,最重要的一点就是----开源 个人 ...

  4. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  5. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  6. 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Release释放操作

    ☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_OfflineOnlyCharging_Release消息交互流程 Nchf_OfflineOnlyCharging_Release是CHF提供 ...

  7. 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Update 更新操作过程

    ☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_OfflineOnlyCharging_Update消息交互过程 Nchf_OfflineOnlyCharging_Update消息是是5G融合 ...

  8. (NO.00004)iOS实现打砖块游戏(五):游戏场景类

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继 ...

  9. [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)

    场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...

  10. [置顶] 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12708811 场景类CCScene和布景类CCLayer都是作为一个容器来使 ...

随机推荐

  1. debian/ubuntu系统vi无法删除字符的解决办法

    之前在 Linux 下操作,一直使用的是 Centos 系统,使用 vi 编辑命令一直很顺畅. 最近,入手了一台 debian 操作系统的 vps.在操作 vi 命令时,发现当输入 i 要进行文件编辑 ...

  2. Windows 记录开机后应用启动慢的问题

    最近大屏产品经常报一些开机启动的问题,工厂反馈厂测软件有些模块测试不通过,家里开发测试均发现Launcher等软件首次启动需要加载10多秒. 经过小伙伴们排查,发现是刷母盘后首次开机问题概率比较大.使 ...

  3. 【Rive】眼睛互动动画

    1 前言 ​ 本文基于 Rive 社区开放的眼睛动画,进一步加工处理,实现更有趣的眼睛互动动画. ​ 原始资源见 → Eye Joysticks Demo,效果如下. ​ 原始资源只有一只眼睛,并且没 ...

  4. Fastadmin框架,服务器搭建环境

    FastAdmin 基于ThinkPHP和Bootstrap的极速后台开发框架 https://www.fastadmin.net 安装node.js 1.获取node.js资源 V8.x: curl ...

  5. Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图

    一.前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有.无论哪个地图厂家,提供的接口都是没 ...

  6. Android RNDIS gadget Windows免驱修改方案

    过程简单粗暴,拿到竞品的设备,然后使用UsbTreeView查看设备的相关描述符. 对比发现接口抽象描述符和接口描述符不一致,直接修改Linux RNDIS gadget 驱动,将驱动中有关的两个描述 ...

  7. Dynaimc CRM查找字段自定义过滤视图

    实现方式参考官方文档提供的Xrm.Page.getControl(arg).addCustomView(viewId, entityName, viewDisplayName, fetchXml, l ...

  8. SpringBoot 集成腾讯云(对象存储、短信)

    https://developer.aliyun.com/article/831473 https://blog.csdn.net/weixin_45626288/article/details/11 ...

  9. 第六章 ArrayBlockingQueue源码解析

    1.对于ArrayBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 public ArrayBlockingQueue(int capacity, boo ...

  10. 深度学习基础理论————CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等)以及代码

    主要介绍在CV中常用的Backbone原理简易代码(代码以及原理经常更新),参考论文中的表格,对不同的任务所使用的backbone如下: 针对上面内容分为两块内容:1.基于卷积神经网络的CV Back ...