manim边做边学--动画联动
今天介绍Manim中的动画联动的技巧,在数学动画中,动画联动是常用的功能,
比如讲解平面几何中三角形与圆的位置关系变化,通过动画联动可以让圆沿着三角形的边滚动,或者让三角形的顶点在圆上移动,从而直观地展示内切、外接等几何关系。
总之,通过动画联动,可以将复杂的概念、关系或变化过程以动态的方式展示出来。
这种动态展示比静态的图像或文字描述更具吸引力,能让观众更容易理解抽象的知识。
1. 联动原理
在Manim中,每个Mobject对象都有一个add_updater函数,这个函数是实现动画联动的关键。
add_updater这个更新函数会在每一帧渲染之前被调用,用于更新Mobject的属性。
例如,你可以用它来改变一个图形的位置、颜色、大小等属性,从而创建动态的动画效果。
当你有多个Mobject并且希望它们的动画相互关联时,add_updater就非常有用。
比如,你有一个圆形和一个正方形,你想让正方形的位置始终跟随圆形的位置变化,就可以通过为正方形添加一个updater函数,在函数内部根据圆形的位置来更新正方形的位置。
add_updater是Mobject类的一个方法。其基本函数原型如下:
add_updater(update_function, index=None, call_updater=False)
其中:
update_function:这是最重要的参数,它是一个可调用对象(通常是一个函数),用于更新Mobject的属性index:当有多个updater联动函数时,index表示updater的调用顺序call_updater:是否在被调用后立即执行一次,而不仅仅是在每一帧渲染之前执行
2. 联动示例
示例是最好的学习资料,之前做尺规作图的动画时,模拟圆规动作的动画就是一个联动动画。
下面的示例主要介绍如何通过联动动画来完成其中的圆规动作。
圆规动画目的是画一个 圆弧,只是在绘制的圆弧的过程中还需要展示了圆弧的起点,终点,
以及绘制过程中动态更新起点终点之间的线。
首先,定义绘制函数:
def ruler(sc: Scene, p1, p2, color=GREEN, angle=PI, axis=OUT):
"""
圆规动画
Parameters
---------
sc
绘制动画的场景
p1
代表圆规的针,绘制时不动的点
p2
代表圆规的笔芯,绘制圆弧的点
color
圆弧的颜色,默认绿色
angle
绘制圆弧的角度,默认PI,相当于绘制半个圆
axis
只有2个值 IN/OUT,分别表示顺时针还是逆时针作弧
"""
# 省略。。。
return arc
实现动画的思路如下:
- 构建3个元素,即:
d1(根据参数中p1坐标绘制的点)d2(根据参数中p2坐标绘制的点)dl(连接p1和p2的虚线)
- 设置
dl的动画,随着d1和d2变化不断重新绘制(这里d1其实是不会变的) - 再设置圆弧的动画,随着
d2的变动,不断绘制新的圆弧(圆弧就是起点到d2的弧) - 通过
Manim自带的动画函数让d2先动,其他动画随之运动 - 最后删除不必要的元素,只保留圆弧在 场景(
sc)中
def ruler(sc: Scene, p1, p2, color=GREEN, angle=PI, axis=OUT):
d1 = Dot(point=p1, color=RED)
d2 = Dot(point=p2, color=color)
dl = DashedLine(d1.get_center(), d2.get_center())
r = np.linalg.norm(p2 - p1)
arc = ArcBetweenPoints(p2, p2, stroke_width=2)
dl.add_updater(lambda z: z.become(DashedLine(d1.get_center(), d2.get_center())))
if np.array_equal(axis, OUT):
arc.add_updater(
lambda z: z.become(
ArcBetweenPoints(
p2, d2.get_center(), radius=r, stroke_color=color, stroke_width=2
)
)
)
if np.array_equal(axis, IN):
arc.add_updater(
lambda z: z.become(
ArcBetweenPoints(
d2.get_center(), p2, radius=r, stroke_color=color, stroke_width=2
)
)
)
sc.add(d1, d2, dl, arc)
sc.play(
Rotate(
d2,
about_point=d1.get_center(),
axis=axis,
angle=angle,
rate_func=linear,
)
)
arc.clear_updaters()
dl.clear_updaters()
sc.remove(d1, d2, dl)
return arc
调用这个函数的效果如下:
ruler(self, np.array([-1, 0, 0]), np.array([-1, 1, 0]))
ruler(self, np.array([1, 0, 0]), np.array([1, 1, 0]), axis=IN)

画两个圆弧的交叉效果:
ruler(self, np.array([-1, -1, 0]), np.array([1.1, -0.2222, 0]), angle=PI / 3)
ruler(
self,
np.array([1, -1, 0]),
np.array([-1.1, -0.2222, 0]),
axis=IN,
angle=PI / 3,
)

3. 注意事项
使用add_updater函数时,首先需要注意的是性能问题,由于add_updater函数会在每一帧渲染前被调用,所以要避免在updater函数中进行复杂的计算。
例如,在一个场景中有大量的Mobject,如果在updater函数中进行高复杂度的矩阵运算或者嵌套循环来更新每个Mobject的位置,会导致动画渲染速度变慢,甚至可能出现卡顿。
其次,当多个Mobject之间存在复杂的依赖关系并且都使用add_updater方法时,要确保更新函数的逻辑正确。
要注意更新函数内部不要出现无意的无限循环或递归情况。
最后,当动画的某个阶段不再需要updater函数来更新Mobject时,要及时使用remove_updater方法移除更新器。
如果不及时移除不再需要的更新器,可能会导致内存泄漏和资源浪费。
manim边做边学--动画联动的更多相关文章
- window.requestAnimationFrame() ,做逐帧动画,你值得拥有
window.requestAnimationFrame() 方法告诉浏览器您希望执行动画,并请求浏览器调用指定的函数在下一次重绘之前更新动画.该方法使用一个回调函数作为参数,这个回调函数会在浏览器重 ...
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- C# 生成月份及天选择列表,方便做下拉框联动
月份及天选择列表,很方便做下拉框联动 /// <summary> /// 获取月份选择列表(根据当前语言环境显示月份名称) /// </summary> private IEn ...
- UIView封装动画--iOS利用系统提供方法来做转场动画
UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- 用Direct2D和DWM来做简单的动画效果2
原文:用Direct2D和DWM来做简单的动画效果2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detai ...
- 用Direct2D和DWM来做简单的动画效果
原文:用Direct2D和DWM来做简单的动画效果 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detail ...
- WPF 后台代码做 TranslateTransform 的动画
本文告诉大家,在后台代码,对 TranslateTransform 做动画的方法 今天小伙伴问我一个问题,说为什么相同的代码,如果设置到按钮上,是可以让按钮的某个属性变更,但是如果设置给 Transl ...
- 用php做省份的三级联动 附带数据库
可以把它做成小插件的形式,以后需要,可以随时调 来看一下怎么来做 先来写个div然后,再引入js包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- 【从无到有】教你使用animation做简单的动画效果
今天写写怎么用animation属性做一些简单的动画效果 在CSS选择器中,使用animition动画属性,调用声明好的关键帧 首先声明一个动画(关键帧): @keyframes name{ from ...
随机推荐
- C++中的各种锁
在多线程开发中,经常会遇到数据同步,很多情况下用锁都是一个很好的选择.C++中常用的锁主要有下面几种: 互斥锁(std::mutex) 这是最基本的一种锁.它用于保护共享资源,在任意时刻,最多只有一个 ...
- Zabbix 和 Prometheus 选型对比
开源的监控产品有很多,其中最知名的,当属早期的 Zabbix 和现在的 Prometheus.Zabbix 是 2001 年发布的,至今已经 20 多年,很多细节打磨的相当到位,Prometheus ...
- 基于.NET开源、功能强大且灵活的工作流引擎框架
前言 工作流引擎框架在需要自动化处理复杂业务流程.提高工作效率和确保流程顺畅执行的场景中得到了广泛应用.今天大姚给大家推荐一款基于.NET开源.功能强大且灵活的工作流引擎框架:elsa-core. 框 ...
- 关于Requests交互超时的处理方式
拿 https://aes.cryptohack.org/ecb_oracle 这道题来做示范. 由于这个链接的本地服务器在外国,因此我们很容易就会连接超时. 如下一个脚本: import reque ...
- 【一步步开发AI运动小程序】七、进行运动计时、计数
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- 原生鸿蒙中的RN日志系统
一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...
- ETCD存储满了如何处理?
一.前言 当运行 ETCD 日志报 Erro: mvcc database space exceeded 时,或者查看健康状态显示 failed to commit proposal: Active ...
- (Python基础教程之十一)Python找到最大的N个(前N个)或最小的N个项目
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- re模块 函数模式详解
re模块 python爬虫过程中,实现页面元素解析的方法很多,正则解析只是其中之一,常见的还有BeautifulSoup和lxml,它们都支持网页HTML元素解析,re模块提供了强大的正则表达式功能 ...
- nginx之常见错误
在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...