对于Manim的用户来说,创建富有表现力的文本动画是其核心功能之一。

最近,Manim的官方文档中悄然增加了两个新的动画类:TypeWithCursorUntypeWithCursor

它们为我们带来了带有光标的打字和删除效果,极大地丰富了文本动画的可能性。

本文将深入探讨这两个新动画类的特性和应用。

1. 动画概要

TypeWithCursorUntypeWithCursor 的核心作用是模拟真实的打字和删除文本的过程。

相比于Manim中已有的WriteUnWrite等动画,它们最大的特点是引入了“光标”这一视觉元素,使得动画效果更加生动和贴近现实。

TypeWithCursor 类似于 AddTextLetterByLetter,可以逐个字符地显示文本,并在当前输入的最后一个字符后面显示一个光标。

这非常适合用于以下场景:

  • 代码演示: 在教学视频或技术分享中,模拟实时编写代码的过程,让观众更清晰地看到代码的输入流程。
  • 对话模拟: 模拟聊天对话框、终端输入等场景,增强动画的代入感。
  • 逐字稿展示: 配合旁白,以打字机的方式逐字显示字幕或关键信息,引导观众的阅读节奏。

UntypeWithCursor 则与TypeWithCursor相反,它类似于RemoveTextLetterByLetter,可以逐个字符地删除文本,并且光标会跟随删除的进度移动。

其应用场景包括:

  • 文本修正: 模拟删除并修改错误文本的过程,可以用于展示“纠错”或“优化”的概念。
  • 信息擦除: 动态地擦除屏幕上的信息,为新的内容腾出空间。
  • 倒计时效果: 通过删除数字来实现倒计时的视觉效果。

这两个类的主要参数类似:

参数名称 类型 说明
time_per_char float 字母出现的频率
cursor VMobject None
buff float 控制光标在最后添加的字母右侧的距离。
keep_cursor_y bool 光标的 y 坐标设置是否为文本的中心,并在整个动画中保持不变
leave_cursor_on bool 是否在动画后显示光标

需要注意的是:目前这两个动画类仅支持对Text对象进行操作,暂时还不支持MathTex

2. 使用示例

下面,我们将通过两个实际的应用场景,来展示TypeWithCursorUntypeWithCursor的使用方法。

2.1. 模拟代码输入与修正

这个例子将模拟一个在终端中输入Python代码,然后发现错误并进行修正的过程。

我们将使用TypeWithCursor来输入代码,然后用UntypeWithCursor删除错误部分,最后再用TypeWithCursor输入正确的代码。

cursor = Rectangle(
height=0.5, width=0.05, fill_color=WHITE, fill_opacity=1, stroke_width=0
) # 错误的Python代码
wrong_code_line = Text("prtin('Hello, Manim!')", font="Monospace").scale(0.7)
# 正确的代码部分
correct_part = (
Text("print", font="Monospace")
.scale(0.7)
.move_to(wrong_code_line[0:5], aligned_edge=LEFT)
) # 设置光标初始位置
cursor.move_to(wrong_code_line.get_left() + LEFT * 0.1) # 动画过程
self.play(TypeWithCursor(wrong_code_line, cursor, time_per_char=0.15))
self.wait()
# 删除错误的 'prtin'
self.play(UntypeWithCursor(wrong_code_line[0:5], cursor, time_per_char=0.1))
self.wait()
# 输入正确的 'print'
self.play(TypeWithCursor(correct_part, cursor, time_per_char=0.15))

在这个例子中,我们自定义了一个白色的细长矩形作为光标。

通过time_per_char参数,我们控制了打字和删除的速度,使得动画更具节奏感。

同时,通过对Text对象进行切片,我们精确地控制了需要删除和重新输入的文本部分。

2.2. 动态标题展示

这个例子将展示如何使用TypeWithCursorUntypeWithCursor来制作一个动态的、引人注目的标题。

我们将先用打字效果展示一个标题,然后将其删除,再展示另一个标题,并在动画间隙播放光标闪烁动画。

# 自定义一个黄色的下划线作为光标
cursor = Line(DOWN * 0.1, RIGHT * 0.2 + DOWN * 0.1, color=YELLOW) # 第一个标题
title1 = Text("Welcome to My Channel", font_size=30) # 第二个标题
title2 = Text("Let's Learn Manim!", font_size=30, color=BLUE) # 动画过程
# 播放打字动画
self.play(TypeWithCursor(title1, cursor, keep_cursor_y=True, time_per_char=0.1))
# 在等待期间播放光标闪烁动画
self.play(Blink(cursor, blinks=3))
# 播放删除动画
self.play(
UntypeWithCursor(
title1,
cursor,
keep_cursor_y=True,
time_per_char=0.05,
leave_cursor_on=True,
)
)
# 再次播放光标闪烁
self.play(Blink(cursor, blinks=3))
# 播放第二个标题的打字动画
self.play(TypeWithCursor(title2, cursor, buff=0.2, time_per_char=0.12))
# 结束时再次闪烁
self.play(Blink(cursor))

在这个例子中,我们使用了一个黄色的Line作为光标,并通过Blink动画使其闪烁。

在动画中,我们设置keep_cursor_y=True来确保光标在y轴方向上保持稳定,这在处理多行文本时非常有用。

我们还通过调整buff参数增大了光标和文字的间距,并通过leave_cursor_on=True让光标在删除动画后依然停留在屏幕上,为接下来的输入动画做好了衔接。

3. 附件

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

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

manim边做边学--文字创建销毁的打字机效果的更多相关文章

  1. 边做边学入门微信小程序之仿豆瓣评分

    微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...

  2. Object-C 对象 (创建/销毁 对象)-- 笔记

    创建/销毁 对象: Dog *dog = [Dog alloc]; //  通过alloc创建dog一个这样的对象, alloc相对于C语言中的new // *号既表示指针,也表示引用 初始化构造函数 ...

  3. 类定义,创建/销毁OC对象

    类定义 1 OC类分为2个文件,一个是.h文件,一个是.m文件: 2 .h文件存放类.函数声明: 3 .m文件类的具体实现: 4 类声明使用关键字@interface.@end来声明: 5 类实现使用 ...

  4. java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56)

    在JavaWeb中的监听器分类 在Javaweb中存在三个被监听对象: HttpServletRequest HttpSessoin ServletContext 监听者 被监听者 监听到事件对象 H ...

  5. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  6. Flexslider图片轮播、文字图片相结合滑动切换效果

    Flexslider是一款基于的jQuery内容滚动插件.它能让你轻松的创建内容滚动的效果,具有非常高的可定制性.开发者可以使用Flexslider轻松创建各种图片轮播效果.焦点图效果.图文混排滚动效 ...

  7. jQuery鼠标悬停文字渐隐渐现动画效果

    jQuery鼠标悬停文字渐隐渐现动画效果 当时是做项目的时候用到的所以图片有些大,九张,真正要做图片不需要这么大 css样式 <style> *{ margin: 0; padding: ...

  8. 调整 FMX Android 文字显示「锯齿」效果

    说明:调整 Firemonkey Android 显示文字有「锯齿」效果 适用:Firemonkey Android 平台 修改方法: 请将源码 FMX.FontGlyphs.Android.pas  ...

  9. 使用 Canvas 和 JavaScript 创建逼真的下雨效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.这里向大家展示一个使用 Canva ...

  10. Particles.js基于Canvas画布创建粒子原子颗粒效果

    文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...

随机推荐

  1. 如何保护价值上千万的Node.js源代码?

    如何保护价值上千万的Node.js源代码?https://zhuanlan.zhihu.com/p/84386456 1|0一个强大的JS混淆器. github.com/javascript-obfu ...

  2. Unity2020更新体验

    最近在整理电脑,总结信息,替换各种生产工具,有点上头,看到2020.1正式版已经出了,决定把Unity也升了,已经在2019.4.7这个版本稳定开发多个项目了(目前唯一遇到的小坑是VFX在mac上点数 ...

  3. LiveRTMP之rtmp流flash播放器无法正常播放问题解决(二)

    问题简介 LiveRTMP是LiveQing团队开发的一套简单易用的RTMP推送SDK.本文想讲述下开发过程中遇到的一个问题.问题的现象是使用LiveRTMP推送音视频流到自己搭建的nginx-rtm ...

  4. 关于自建Rustdesk 远程桌面服务器的公网访问:无法连接中继服务器的问题解决方法

    自建服务器位于内网时,内网客户端ID/中继的地址通常写成内网IP,外网客户端一般会用公网IP进行端口映射,但这样设置出现外网客户端无法连接中继服务器,但内网客户端使用正常的现象. 经过半天的排查分析, ...

  5. 手把手教你搭建LLM工作流,自动发送精美企微markdown消息

    公众号:进步日志,欢迎关注. 需求背景:保后管理部,会每天人工统计及整理C-M1数据,入账及回盘相关的数据,最后汇总整理相关话术,发送到微信群. 于是咨询我能不能使用Deepseek等大模型实现.前两 ...

  6. 【光照】[PBR][法线分布]GGX实现方法对比

    [从UnityURP开始探索游戏渲染]专栏-直达 GGX的全称与基本概念 ‌GGX的全称‌:Ground Glass X (或 Generalized Trowbridge-Reitz Distrib ...

  7. Storm测试

    package storm.scheduler; import java.util.ArrayList; import java.util.Collection; import java.util.L ...

  8. 智能防御,安全赋能:AI-FOCUS 滤海AI DLP 化解外部 AI 风险

    在"员工把数据投喂给第三方AI"的常见场景下,企业需要一款可在输入与上传瞬时介入的产品.AI-FOCUS 滤海AI DLP 以流式网关为核心,在用户向大模型输入文本与提交文件/图片 ...

  9. 博弈论dp复习笔记

    Stones 题目概述 集合 \(A\),小 \(X\) 和小 \(Y\) 选择其中一个数 \(x\),然后将石堆拿走 \(x\) 个,谁不能操作谁输,一开始石堆石头数量为 \(k\). 数据范围:\ ...

  10. centos7下安装nodejs-v16.x

    今天记录一下centos7下安装nodejs-v16.x版本的nodejs 官方下载:CNPM Binaries Mirror (npmmirror.com) 安装步骤 1.下载nodejs-v16. ...