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. Docker基础教程快速入门 Linux CentOS安装与使用Docker容器

    Docker 介绍 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器解决方案. Docker 将应用程序与该程序的依赖,打包在一个文件里面 ...

  2. [转]关于opencv4.0中“未定义标识符cvNamedWindow”的解决方法

    这个问题困扰了很久,在网上找了很多方法,但是都没用, 比如:"在代码开头加入头文件#include <opencv2/highgui/highgui_c.h>"之类的方 ...

  3. An invitation to 3-d vision: from images to geometric models英文pdf下载

    Ma Y, Soatto S, Košecká J, et al. An invitation to 3-d vision: from images to geometric models[M]. N ...

  4. WebClient 用法小结

    进来的项目中要实现能够在windows service中调用指定项目的链接页面.由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类. 如果只想从特定的URI请求文件,则使用 ...

  5. w3cschool-Lua 教程

    https://www.w3cschool.cn/lua/ Lua 学习笔记之一(初阶话题) 1.八种基本类型: 如下表 基本类型 描述 备注 数值(number) 内部以double表示 字符串(s ...

  6. IDEA 2020.3.2 安装激活教程

    注意 本教程适用于 IntelliJ IDEA 2020.3.2 以下所有版本,请放心食用~ 本教程适用于 JetBrains 全系列产品,包括 Pycharm.IDEA.WebStorm.Phpst ...

  7. 浅说 c++20 coroutine

    浅说cppcoro 上一篇<浅说c/c++ coroutine>介绍了stackful协程,举了win32 Fiber跟tencent/libco为例. 本篇https://www.cnb ...

  8. C#数据结构与算法入门实战指南

    前言 在编程领域,数据结构与算法是构建高效.可靠和可扩展软件系统的基石.它们对于提升程序性能.优化资源利用以及解决复杂问题具有至关重要的作用.今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望 ...

  9. linux:init

    init命令启动级别的含义(0-6) 0:停机1:单用户形式,只root进行维护2:多用户,不能使用net file system3:完全多用户4:未使用(系统之间可能略有不同,有些人的博客写的是安全 ...

  10. Dibble pg walkthrough Intermediate

    nmap 21/tcp open ftp vsftpd 3.0.3 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Can't get ...