本篇介绍Manim中用于突出显示某些内容的动画类,主要包括:

  1. ApplyWave:让图形或文字产生连续波浪式变形的动画类,用于展示波动效果,参数可调节
  2. Circumscribe:用于在几何场景中展示图形与其外接图形的关系,动画围绕对象生成外接图形
  3. Flash:通过快速改变对象视觉属性产生闪烁效果,用于强调对象,闪烁参数可自定义
  4. FocusOn:能模拟相机聚焦,引导观众关注特定对象,可设置聚焦速度、缩放比例等参数
  5. Indicate:以箭头、线条等方式指示对象部分或步骤,自定义指示形状、颜色和动态效果
  6. ShowPassingFlash:在对象移动路径上留下短暂闪光,用于体现快速经过的场景,闪光参数可控
  7. Wiggle:使对象在原始位置附近小幅度随机晃动,用于模拟不稳定状态,晃动参数能够调整

1. 动画概述

1.1. ApplyWave

ApplyWave以一种连续、流畅的方式使对象产生波浪式的变形。

可以控制波浪的幅度、频率等参数,通过调整这些参数能够创造出不同强度和风格的波浪效果。

这种变形效果是基于对象的几何形状进行计算的,所以对于复杂形状的对象也能很好地应用,并且能够保证变形过程的平滑性。

它在制作一些具有动态美感的数学函数图像演示或者波动现象(比如物理中的波的传播)时非常有用,

也可以用于文字,使文字产生一种类似在水面上波动的视觉效果,用于一些创意动画的标题展示等场景。

它的主要参数有:

参数名称 类型 说明
mobject Mobject 要进行变形的 Mobject对象
direction np.ndarray 波浪推动形状点的方向
amplitude float 形状点移动的距离
wave_func func 定义一个波峰形状的函数
time_width float 波浪相对于 mobject 宽度的长度
ripples int 波浪的波纹数量

1.2. Circumscribe

Circumscribe着重于突出对象与其外接图形的关系。

动画过程通常是围绕着目标对象生成外接图形,并且可以设置动画的速度和精度。

在生成外接图形的过程中,会根据对象的几何特征来确定外接图形的位置和大小,以确保准确地表现外接的概念。

它主要用于展示图形与外接图形之间的关系。

比如在讲解三角形的外接圆时,可以使用这个动画效果,清晰地展示圆是如何围绕三角形并通过其三个顶点的。

此外,对于一些有外接几何形状概念的其他图形(如四边形的外接椭圆等)也可以使用,能够直观地帮助观众理解外接这一几何关系。

它的主要参数有:

参数名称 类型 说明
mobject Mobject 要进行环绕绘制的 Mobject对象
shape Type 用于环绕给定 Mobject 的形状,只能是矩形(Rectangle)或圆形(Circle
fade_in bool 是否使环绕形状淡入
fade_out bool 是否使环绕形状淡出
time_width float 绘制和擦除的时间宽度
buff float 环绕形状与给定 Mobject 之间的距离
color Color 环绕形状的颜色

1.3. Flash

Flash的特点是快速地改变对象的颜色或透明度等视觉属性来产生闪烁效果,

可以自定义闪烁的次数、频率和颜色变化方式。

当需要强调某个对象或者对象的某个部分时Flash非常有用。

例如,在展示一个复杂的数学模型中的关键元素,或者在一个化学分子结构中突出特定的原子或化学键时,可以使用Flash来吸引观众的注意力。

它的主要参数有:

参数名称 类型 说明
point ndarray / Mobject 闪烁线条的中心点。如果传入的是Mobject,则使用其中心作为中心点
line_length float 闪烁线条的长度
num_lines int 闪烁线条的数量
flash_radius float 闪烁线条开始的距离点
line_stroke_width int 闪烁线条的笔触宽度
color Color 闪烁线条的颜色
time_width float 闪烁线条的时间宽度

1.4. FocusOn

FocusOn能够模拟相机聚焦的效果,将画面的中心或者重点转移到目标对象上,

可以设置聚焦的速度、缩放比例等参数,使聚焦过程更加自然。

它可用于在复杂的场景或者包含多个对象的动画中,引导观众关注特定的区域或对象。

它的主要参数有:

参数名称 类型 说明
focus_point ndarray / Mobject 聚光灯收缩到的点。如果传入的是Mobject,则使用其中心作为收缩点
opacity float 聚光灯的不透明度
color Color 聚光灯的颜色

1.5. Indicate

Indicate通常会以箭头、线条或者颜色变化等方式来指示目标,

可以自定义指示的形状、颜色和动态效果(如箭头的摆动、线条的闪烁等)。

这种指示效果是比较明确的,能够直接引导观众的视线到需要关注的地方,并且可以与其他动画效果结合使用,增强指示的效果。

它在教学动画中经常使用,用于指示对象的某个部分或者强调某个操作步骤。

它的主要参数有:

参数名称 类型 说明
mobject Mobject 要突出显示的 Mobject
scale_factor float Mobject 突出显示时缩放的比例因子
color Color Mobject 突出显示的颜色

1.6. ShowPassingFlash

ShowPassingFlash主要是在对象移动的路径上留下短暂的闪光效果,模拟物体快速通过时的光影变化,

可以控制闪光的颜色、持续时间和强度等参数,以适应不同的场景需求。

它一般用于表现对象的短暂出现或者快速通过的场景。

它的主要参数有:

参数名称 类型 说明
mobject VMobject 要应用此动画效果的对象
time_width float 相对于笔画长度中闪光部分的长度,该参数控制了每一帧中显示的对象部分的大小比例

1.7. Wiggle

Wiggle能够使对象在其原始位置附近进行小幅度的随机晃动,可以调整晃动的幅度、频率和方向等参数。

晃动效果看起来比较自然,不是那种规则的运动,能够很好地模拟出不稳定或者颤抖的状态,而且不会让对象偏离其原始位置太远,保持了一定的整体稳定性。

它用于给对象添加一种不稳定、轻微晃动的效果。

它的主要参数有:

参数名称 类型 说明
mobject Mobject 要摆动的Mobject对象
scale_value float Mobject 摆动时缩放的比例因子
rotation_angle float 摆动角度
n_wiggles int 摆动次数
scale_about_point ndarray Mobject 缩放的中心点
rotate_about_point ndarray Mobject 旋转的中心点

2. 使用示例

下面通过示例来演示各个突出显示类动画的使用。

2.1. ApplyWave 示例

首先创建一个文本对象Text,然后分别演示 ApplyWave 不同参数的设置效果。

  1. 第一次使用默认参数,展示基本的波浪变形效果
  2. 第二次指定了方向为向右(RIGHT)、时间宽度为 0.5、振幅为 0.3,观察这些参数对动画的影响
  3. 第三次设置了速率函数为线性(linear)和波纹数量为 4,查看线性速率和波纹数量下的效果。
  4. 第四次设置了速率函数为非线性(rush_into)和波纹数量为 4,查看非线性速率和波纹数量下的效果
# 创建一个文本对象
t = Text("Hello, Manim!").scale(1.5)
self.add(t) # 默认参数的ApplyWave
self.play(ApplyWave(t))
self.wait() # 指定方向 时间宽度和振幅的ApplyWave
self.play(
ApplyWave(
t,
direction=RIGHT,
time_width=0.5,
amplitude=0.3,
),
)
self.wait() # 线性波纹
self.play(
ApplyWave(
t,
rate_func=linear,
ripples=4,
),
)
self.wait() # 非线性波纹
self.play(
ApplyWave(
t,
wave_func=rush_into,
ripples=4,
),
)

2.2. Circumscribe 示例

首先创建一个矩形,然后针对矩形分别演示了Circumscribe的不同参数设置效果。

比如默认参数、指定形状为圆形、淡入、淡出、以及Circumscribe与矩形的间隔buff等等。

# 创建一个矩形
rect = Rectangle(width=3, height=2)
self.add(rect) # 默认参数的Circumscribe
self.play(Circumscribe(rect))
self.wait() # 指定形状为圆形的Circumscribe
self.play(Circumscribe(rect, Circle))
self.wait() # 淡入效果
self.play(
Circumscribe(
rect,
fade_in=True,
buff=0.1,
color=RED,
)
)
self.wait() # 淡出效果
self.play(
Circumscribe(
rect,
fade_out=True,
buff=0.3,
color=GREEN,
)
)

2.3. Flash 示例

首先创建一个和一个,然后针对分别演示了 Flash 的不同参数设置效果。

对于,展示了默认参数的 Flash 效果;

对于,依次展示了指定线条长度数量颜色起始半径线条宽度时间宽度、和速率函数等参数的效果。

# 创建一个点和一个圆
dot = Dot().shift(UP * 2)
circle = Circle(radius=1)
self.add(dot, circle) # 默认参数Flash
self.play(Flash(dot))
self.wait() # 指定线条长度 数量和颜色的Flash
self.play(
Flash(
circle,
line_length=0.5,
num_lines=20,
color=YELLOW,
)
)
self.wait() # 指定起始半径和线宽度的Flash
self.play(
Flash(
circle,
line_stroke_width=5,
flash_radius=1.5,
)
)
self.wait() # 指定速率函数的Flash
self.play(
Flash(
circle,
rate_func=rush_into,
time_width=2,
)
)

2.4. FocusOn 示例

首先创建一个正方形,然后针对正方形分别演示了FocusOn的不同参数设置效果。

除了默认参数,还展示指定不透明度和指定颜色的效果。

# 创建一个正方形和一个三角形
square = Square()
self.add(square) # 默认参数的FocusOn
self.play(FocusOn(square))
self.wait() # 指定不透明度的FocusOn
self.play(FocusOn(square, opacity=0.8))
self.wait() # 指定颜色的FocusOn
self.play(FocusOn(square, color=RED))

2.5. Indicate 示例

首先创建一个文本对象和一个圆形,然后针对文本圆形分别演示Indicate的不同参数设置效果。

比如指定缩放比例因子、指定颜色,以及指定速率函数的效果。

# 创建一个文本对象和一个圆形
text = Text("Indicate Me!").shift(UP * 2)
circle = Circle(radius=1)
self.add(text, circle) # 默认参数的Indicate
self.play(Indicate(text), Indicate(circle))
self.wait() # 指定缩放比例因子的Indicate
self.play(
Indicate(text, scale_factor=1.5),
Indicate(circle, scale_factor=1.5),
)
self.wait() # 指定颜色的Indicate
self.play(
Indicate(text, color=GREEN),
Indicate(circle, color=BLUE),
)
self.wait() # 不同速率函数的Indicate
self.play(
Indicate(text, rate_func=there_and_back),
Indicate(circle, rate_func=there_and_back_with_pause),
)

2.6. ShowPassingFlash 示例

先创建一个正五边形,然后演示ShowPassingFlash在不同time_width下的效果。

# 创建一个多边形作为示例图形
p = RegularPolygon(n=5, color=GRAY).scale(2)
self.add(p) colors = [RED, BLUE, GREEN]
time_widths = [0.5, 1, 2] # 不同time_width参数的效果
for idx, tw in enumerate(time_widths):
self.play(
ShowPassingFlash(
p.copy().set_color(colors[idx]),
time_width=tw,
run_time=2,
)
)
self.wait()

2.7. Wiggle 示例

首先创建了一个文本对象和一个矩形,然后分别演示Wiggle默认参数scale_value参数,rotation_angle 参数,n_wiggles参数以及scale_about_pointrotate_about_point参数的使用效果。

# 创建一个文本对象和一个矩形作为示例图形
t = Text("Wiggle Example").shift(UP)
r = Rectangle(width=2, height=1).shift(DOWN)
self.add(t, r) # 默认参数下的Wiggle
self.play(Wiggle(t), Wiggle(r))
self.wait() # 指定scale_value参数
self.play(
Wiggle(t, scale_value=1.3),
Wiggle(r, scale_value=1.5),
)
self.wait() # 指定rotation_angle参数
self.play(
Wiggle(t, rotation_angle=np.pi / 4),
Wiggle(r, rotation_angle=np.pi / 3),
)
self.wait() # 指定n_wiggles参数
self.play(
Wiggle(t, n_wiggles=4),
Wiggle(r, n_wiggles=8),
)
self.wait() # 指定scale_about_point和rotate_about_point参数
self.play(
Wiggle(
r,
scale_about_point=r.get_center(),
rotate_about_point=r.get_corner(UR),
)
)

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(indication.py),

下载地址: 完整代码 (访问密码: 6872)

manim边学边做--突出显示的更多相关文章

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

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

  2. 11月10日下午 ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

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

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

  4. 牛腩学Kotlin做Android应用

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

  5. [翻译] MCProgressView 使用自定义图片做进度显示

    MCProgressView 使用自定义图片做进度显示 https://github.com/Baglan/MCProgressView Progress bar view with custom i ...

  6. ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

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

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

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

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

  9. c# select标签绑定枚举,并以Description做Text显示

    今天在做项目时遇到一个问题: 开发中有些字段是枚举类型如 Dept 企业表中可能有个字段 Property 性质 0:事业单位,1:私企,2:外企,但有时我们不会单独为性质这个字段定义一张表, 而是在 ...

  10. ligerui做分页显示数据

    现在前台技术用到的是ligerui,一直想写一个有关ligerui的显示,利用加班的今天偷点闲复制一下下,当自己的一些小资料吧,不会的时候,还可以来看看............稍微有点多,毕竟是从前后 ...

随机推荐

  1. 【赵渝强老师】阿里云大数据ACP认证之阿里大数据产品体系

    阿里大数据产品体系是基于阿里云飞天平台上的数据处理服务.主要分为阿里云大数据基础产品和阿里云数加平台,其产品架构图如下所示: 一.阿里云大数据基础产品 1.云数据库--RDS(ApsaraDB for ...

  2. Nuxt.js 应用中的 app:mounted 钩子详解

    title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: ap ...

  3. USB分析仪USB3.2日志分析

    1.简介 USB2.0总线采用轮询模式,即总线事务开始时,都要先发送IN或者OUT令牌包,以通知端点或者查询端点是否准备好.而USB3.2采用了异步通知模式,若端点没有准备好,则主机无需轮询,端点准备 ...

  4. Vue3 和 Vue2 的区别 ?

    1. Vue3 和 VUe2 性能提升 :使用 proxy 代替 defainProperty 实现响应式数据 :使用 ts 书写代码 : 新特性有:组合 api compositionApi  :新 ...

  5. 16. VUE怎么阻止冒泡

    给事件添加 stop 修饰符 ,比如 click.stop  ; 补充: 阻止默认行为 prevent 修饰符 ,超链接的跳转,表单的默认提交 : once 修饰符 事件只触发一次 ps:事件修饰符可 ...

  6. .NET程序获取当前IP经纬度,并通过经纬度实现天气查询功能

      创建一个.net 8的webapi项目备用   编辑一个实体类,该实体类用于存储获取ip地址的经纬度数据使用   继续编辑三个类,用来存储对应经纬度的具体天气数据包:   改造默认的天气控制器,里 ...

  7. 云原生周刊:Cilium v1.16.0 发布|20240729

    开源项目 Cyclops Cyclops 是一个开源的开发工具,通过易于使用的用户界面简化了 Kubernetes,使其更易上手.不再需要使用 YAML 创建和配置 Kubernetes 清单,可以使 ...

  8. KubeSphere 社区双周报 | 功能亮点抢“鲜”看 | 2022-09-30

    KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...

  9. 如何使用 GoGoCode 一键 Vue2 转换 Vue3

    前言 从今年年初开始,项目开始升级优化,将之前的 Vue2 旧版本整体升级到 Vue3 版本.在重写了几个 Vue 文件后,我发现做的都是一些机械性的工作,效率低且重复性大.于是就试着搜索了一下有没有 ...

  10. 一次彻底掌握数据中心级的JVM调优实战经验

    出现内存溢出的场景通常发生在应用程序中存在内存泄漏.对象生命周期过长.对象频繁创建但未能及时回收等问题.以下是几个真实的业务场景,结合内存溢出问题,并从多个角度提出优化方法,来提高内存使用效率. 场景 ...