在动画制作中,尤其是数学和科学可视化领域,有时我们需要将观众的注意力集中在场景的某个特定部分。

Manim提供了一个强大的工具 ZoomedScene,它允许我们在场景中创建一个独立的缩放视图,从而实现对局部细节的深入展示。

本文将详细介绍ZoomedScene的作用、参数、方法,并通过实际示例展示其强大功能。

1. ZoomedScene概要

ZoomedSceneManim中一个专门用于局部缩放的场景类。

其核心功能是允许我们在主场景中创建一个独立的“缩放窗口”,通过这个窗口,可以清晰地展示场景中某个部分的细节。

这种设计特别适用于以下场景:

  • 数学公式推导:在展示复杂的数学公式时,可以使用ZoomedScene对公式中的关键部分进行放大,帮助观众更好地理解
  • 科学实验演示:在展示微观现象(如细胞结构、分子运动)时,通过缩放功能,可以让观众更直观地观察细节。
  • 工程设计展示:对于复杂的机械结构或电路设计,ZoomedScene可以帮助观众聚焦于关键部件
  • 教育动画:在教学视频中,通过局部缩放,可以更有效地引导学生关注重点内容

1.1. 主要参数

ZoomedScene的主要参数有:

参数名称 类型 说明
camera_class class 用于定义场景的相机类,默认为MultiCamera。它决定了场景的渲染方式
zoomed_display_height float 缩放窗口的高度,默认值为 3
zoomed_display_width float 缩放窗口的宽度,默认值为 3
zoomed_display_center array 缩放窗口的中心位置,默认为None,表示自动计算
zoomed_display_corner array 缩放窗口在场景中的角落位置,默认为[1, 1, 0],表示窗口位于右上角
zoomed_display_corner_buff float 缩放窗口与角落的距离,默认值为 0.5
zoomed_camera_config dict 缩放相机的配置参数,例如背景透明度和边框宽度
zoomed_camera_image_mobject_config dict 缩放相机图像的配置参数
zoomed_camera_frame_starting_position array 缩放相机的初始位置,默认为[0, 0, 0]
zoom_factor float 缩放比例,默认值为 0.15。它决定了缩放窗口与主场景的比例关系
image_frame_stroke_width float 缩放窗口边框的宽度,默认值为3
zoom_activated bool 是否激活缩放功能,默认为False

1.2. 主要方法

ZoomedScene的主要方法有:

名称 说明
activate_zooming 激活缩放功能
get_zoom_factor 获取当前的缩放比例
get_zoom_in_animation 返回一个缩放动画
get_zoomed_display_pop_out_animation 返回缩放窗口弹出的动画

2. 使用示例

为了更好地理解ZoomedScene的功能,我们将通过四个实际示例展示其特点。

2.1. 公式的局部放大

视频中展示欧拉公式时,在另一个位置中展示公式的局部放大。

在讲解复杂的公式时,可以使用这个功能来突出显示其中的正在讲解的参数。

formula = MathTex("e^{i\\pi} + 1 = 0").scale(2)
self.add(formula)
self.activate_zooming(animate=True)
self.wait()
self.play(self.get_zoom_in_animation(run_time=2))

2.2. 不同图形的细节

这个示例交互式切换圆形 / 正方形的局部观察。

circle = Circle().shift(LEFT)
d1 = Dot(circle.get_center(), radius=0.1, color=RED)
square = Square(color=BLUE).shift(RIGHT)
d2 = Dot(square.get_center(), radius=0.1, color=BLUE)
self.add(circle, square, d1, d2)
self.activate_zooming(animate=True) # 动态切换缩放目标
f = self.zoomed_camera.frame
self.play(f.animate.move_to(circle))
self.play(self.get_zoom_in_animation())
self.play(f.animate.move_to(square))
self.play(self.get_zoom_in_animation())

2.3. 切换不同的部分

这个示例演示逐步放大图中不同节点的过程。

nodes = VGroup(
Dot(color=GREEN),
Dot(color=YELLOW),
Dot(color=BLUE),
).arrange(RIGHT, buff=2)
self.add(nodes)
self.activate_zooming(animate=True) f = self.zoomed_camera.frame
# 多阶段缩放展示
self.play(f.animate.move_to(nodes[0]))
self.play(self.get_zoom_in_animation())
self.play(f.animate.move_to(nodes[1]))

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(zoom.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. EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)

    本文转自:http://blog.csdn.net/jyt0551/article/details/56063869 视频播放局部缩放.广角平移功能 在预览图片的时候,利用手势控制图片的缩放.平移,已 ...

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

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

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

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

  6. 24小时学通Linux内核--内核探索工具类

    寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...

  7. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  8. 边学边做,简单的 GraphQL 实例

    项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...

  9. NGUI 做局部2d卷轴

    网上找到的都是做整个背景的卷轴动画,通常是改变纹理位置或者背景图片的x坐标 没有提到在UI界面里某个部分做卷轴动画,找了很久,才发现NGUI的Panel里的Clipping属性可以裁剪Panel的大小 ...

  10. ChartView与LineSeries搭配实现曲线局部缩放功能

    效果图: 上一篇文章实现的时候还不知道有QtChart这个模块......好好看了下资料就想做个例子实现一下这功能,比较了下代码量...恩,直接看代码: Rectangle { id: view_re ...

随机推荐

  1. 【服务器安全问题】双防火墙有什么意义?SSH暴力破解如何防范

    发现我的服务器有大量的陌生IP尝试SSH登录,似乎想暴力破解. 我个人习惯是服务器提供商开放了所有端口的,同时也没有开启运维软件提供的防火墙emm 这倒是让我想到了 一般服务器提供商(比如阿里云.华为 ...

  2. Qt编写的项目作品18-数据导入导出(xls/pdf)及打印示例

    一.功能特点 组件同时集成了导出数据到csv.xls.pdf和打印数据. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便. 同时支持QTableView.QTab ...

  3. 清除 TortoiseSVN已存储的连接URL地址

    Eclipse 清除 SVN 的 URL 历史记录1.关闭 Eclipse2.进入 工程目录 \.metadata\.plugins\org.tigris.subversion.subclipse.c ...

  4. [转]vue项目启动时,npm run serve 和 npm run dev 的区别

    npm run serve 和 npm run dev 的区别 在我们运行一些 vue 项目的时候,输入npm run serve或者 npm run dev的其中一个时,系统会报错: PS C:\U ...

  5. [转]在MyBatis中使用pageHelper5.1.9分页插件实现物理分页

    pagehelper的GIT地址:https://github.com/pagehelper/Mybatis-PageHelper/ 废话少说,直接给出中文官方链接: 1.如何使用分页插件 2.HOW ...

  6. 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践

    本文由作者"阿宝哥"分享,原题"你不知道的 WebSocket",有修订和改动. 1.引言 本文将从基本概念.技术原理.常见易错常识.动手实践等多个方面入手,万 ...

  7. IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?全方位实测!

    本文由陶文分享,InfoQ编辑发布,有修订和改动. 1.前言 本系列的前几篇主要是从各个角度讲解Protobuf的基本概念.技术原理这些内容,但回过头来看,对比JSON这种事实上的数据协议工业标准,P ...

  8. 在linux上Git配置多个SSH-Key

    Git配置多个SSH-Key SSH Key 背景 当有多个git账号时,比如: a. 一个gitee,用于公司内部的工作开发: b. 一个github,用于自己进行一些开发活动: c.一个gitla ...

  9. JVM实战—7.如何模拟GC场景并阅读GC日志

    大纲 1.动手模拟出频繁Young GC的场景 2.JVM的Young GC日志应该怎么看 3.代码模拟动态年龄判定规则进入老年代 4.代码模拟S区放不下部分进入老年代 5.JVM的Full GC日志 ...

  10. react学习之antd

    antd 为 Web 应用提供了丰富的基础 UI 组件,我们还将持续探索企业级应用的最佳 UI 实践.它最初是基于 React 的组件库,但随着技术的发展,现在也提供了基于 Vue.js 的版本--A ...