manim边做边学--动画轨迹
本篇介绍Manim
中两个和动画轨迹相关的类,AnimatedBoundary
和TracedPath
。
AnimatedBoundary
聚焦于图形边界的动态呈现,能精准控制边界绘制的每一帧,助力我们清晰展示几何图形的搭建流程。
TracedPath
则擅长实时追踪物体或点的运动轨迹,以直观且动态的方式呈现各类运动路径,为我们分析和展示复杂运动提供了强大支持 。
1. 动画概述
1.1. AnimatedBoundary
在讲解几何图形(如多边形、圆形等)的构造过程时,AnimatedBoundary
可以逐帧展示图形边界的绘制,帮助我们理解图形是如何一步步形成的。
此外,当图形的边界随着某个参数或条件动态变化时,使用 AnimatedBoundary
也可以生动地呈现这种变化。
AnimatedBoundary
动画的主要特点在于图形边界的绘制,它能够精确控制边界的出现顺序和方式。
这使得在展示几何图形的构建过程时,能够突出边界这一关键元素,更清楚地展示图形的轮廓是如何形成的。
它的参数主要有:
参数名称 | 类型 | 说明 |
---|---|---|
vmobject | VMobject | 要应用动画边界的 VMobject |
colors | [Color] | 颜色列表,用于指定边界颜色变化的序列 |
max_stroke_width | int | 最大描边宽度 |
cycle_rate | float | 颜色循环速率 |
back_and_forth | bool | 是否来回循环颜色变化 |
draw_rate_func | func | 用于控制绘制速率的函数 |
fade_rate_func | func | 用于控制淡出速率的函数 |
1.2. TracedPath
在物理学或数学中,当需要展示物体的运动轨迹时,TracedPath
是一个非常合适的工具。
例如,展示抛体运动、圆周运动等物体的运动路径时,能让我们直观地看到物体在空间中的运动轨迹。
此外,对于函数图像的绘制,也可使用 TracedPath
来模拟绘图过程,展示函数曲线是如何随着自变量的变化而逐步生成的。
这在演示函数的性质和图像绘制方法时非常有用,能够帮助学生更好地理解函数的变化规律。
TracedPath
动画的主要特点是能够实时跟踪物体或点的运动轨迹,并将其以动画的形式呈现出来。
这种实时跟踪的特性使得动画更加真实、生动,能够准确地反映物体的运动状态。
它的参数主要有:
参数名称 | 类型 | 说明 |
---|---|---|
traced_point_func | func | 要跟踪的函数,该函数应返回一个点的坐标 |
stroke_width | float | 轨迹的线条宽度 |
stroke_color | Color | 轨迹的颜色 |
dissipating_time | float | 路径消散所需的时间 |
当dissipating_time
参数为None
时,表示路径轨迹不消散。
TracedPath
还有一个方法:
名称 | 说明 |
---|---|
update_path | 用于更新轨迹路径的方法,通常在动画过程中被调用,以实时跟踪点的移动并更新轨迹 |
2. 使用示例
下面通过几个根据实际应用场景简化而来的示例来演示两个动画类的使用。
2.1. 多边形绘制
这个示例中,首先创建了一个矩形多边形,然后使用 AnimatedBoundary
为其添加边界动画,
颜色在蓝色、绿色、黄色之间循环变化,循环速率为 3
,突出展示多边形边界的绘制动画。
polygon = Polygon(
[-2, -1, 0],
[2, -1, 0],
[2, 1, 0],
[-2, 1, 0],
)
boundary = AnimatedBoundary(
polygon,
colors=[BLUE, GREEN, YELLOW],
cycle_rate=3,
)
self.add(polygon, boundary)
2.2. 动态更新圆形边界
先创建了一个圆形,其边界的颜色在红色,黄色和绿色之间循环,循环速率为 2。
然后通过动画将圆形的半径放大 2
倍,展示了圆形边界在动态变化过程中的动画效果。
circle = Circle(radius=1)
boundary = AnimatedBoundary(
circle,
colors=[RED, YELLOW, GREEN],
cycle_rate=2,
)
self.add(circle, boundary)
self.play(circle.animate.scale(2), run_time=3)
2.3. 跟踪抛体运动轨迹
首先定义一个抛体运动的函数 move_path
,再创建了一个点 Dot
和一个 TracedPath
对象来跟踪点的运动轨迹。
轨迹颜色为绿色,宽度为 3
,展示了抛体运动的轨迹跟踪效果。
d = Dot().shift(LEFT * 2)
trace = TracedPath(
d.get_center,
stroke_color=GREEN,
stroke_width=3,
)
self.add(d, trace)
def move_path(t):
x = t
y = 2 - 0.5 * t**2
return np.array([x, y, 0])
f = ParametricFunction(
move_path,
t_range=(-3, 3),
)
self.play(MoveAlongPath(d, f), run_time=3)
2.4. 函数图像绘制过程
这个示例中,定义了一个正弦函数 move_path
,再创建一个点沿着这个正弦函数图像运动,同时创建了一个 TracedPath
对象来跟踪函数图像的绘制过程。
轨迹颜色为紫色,宽度为 2
,且设置轨迹在1
秒后消失。
d = Dot(color=BLUE).shift([-PI, 0, 0])
trace = TracedPath(
d.get_center,
stroke_color=PURPLE,
stroke_width=2,
dissipating_time=1,
)
self.add(d, trace)
def move_path(x):
return np.array([x, np.sin(x), 0])
f = ParametricFunction(move_path, t_range=(-PI, PI))
self.play(MoveAlongPath(d, f), run_time=3)
3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(trace.py
),
下载地址: 完整代码 (访问密码: 6872)
manim边做边学--动画轨迹的更多相关文章
- window.requestAnimationFrame() ,做逐帧动画,你值得拥有
window.requestAnimationFrame() 方法告诉浏览器您希望执行动画,并请求浏览器调用指定的函数在下一次重绘之前更新动画.该方法使用一个回调函数作为参数,这个回调函数会在浏览器重 ...
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- 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 ...
- 【从无到有】教你使用animation做简单的动画效果
今天写写怎么用animation属性做一些简单的动画效果 在CSS选择器中,使用animition动画属性,调用声明好的关键帧 首先声明一个动画(关键帧): @keyframes name{ from ...
- 用 CSS3 做一个流星雨动画
昨天 UI 提交过来一个登录页的设计稿,要求背景有一个流星雨动画,做完之后觉得挺有趣,分享一下~ 一.流星动画 首先创建一个 div 作为画布 <div id="stars" ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
随机推荐
- Java高并发之线程的实现方式,含Lamabda表达式
Java中线程实现的方式 在 Java 中实现多线程有4种手段: 1.继承 Thread 类 2.实现 Runnable 接口 3.匿名内部类 4.Lambda表达式实现 实现 Runnable 接口 ...
- FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是Bilibili公司(简称B站)基于FFmpeg3.4研发并开源的国产播放器,它可运行于Android和iOS系统,既支持播放本地视频文件,也支持播放网络上的流媒体链接. 之前的 ...
- 题解:CF888G Xor-MST
题解:CF888G Xor-MST 题目大意:给定 \(n\) 个点的点权, 任意两点间边权是点权的异或和.求这张完全图的 MST 的权值. 思路: Boruvka + Trie树 + 按位贪心. 关 ...
- .Net Core NPOI 导出多级表头
想要导出这样的表格 数据准备格式 附上源码 1 using NPOI.HSSF.UserModel; 2 using NPOI.SS.UserModel; 3 using NPOI.SS.Util ...
- 3.8 Linux显示当前工作路径(pwd命令)
由于 Linux 文件系统中有许多目录,当用户执行一条 Linux 命令又没有指定该命令或参数所在的目录时,Linux 系统就会首先在当前目录(目前的工作目录)搜寻这个命令或它的参数.因此,用户在执行 ...
- 灵活轻巧的java接口自动化测试实战
前言 无论是自动化测试还是自动化部署,撸码肯定少不了,所以下面的基于java语言的接口自动化测试,要想在业务上实现接口自动化,前提是要有一定的java基础. 如果没有java基础,也没关系.这里小编也 ...
- 查看一个package是否在执行
select a.type, a.owner, b.SID, b.SERIAL#, b.OSUSER, b.MACHINE, b.PROGRAM, b.MODULE, b.ACTION From db ...
- rabbitmq消息中间件的初步探索
在上次学xattr的时候用它简单实现一个中间件,我去了解了一下rabbitmq这个消息中间件,感觉理论上还是挺好用的,给一般并发量的系统用足够了. 首先安装这个服务. sudo apt search ...
- 从零开始学机器学习——入门NLP
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天我们将深入探讨自然语言处理(Natural Language Processing, NLP)这 ...
- XSS跨站脚本之portswigger labs练习
目录 1 什么是XSS 2 XSS的类型有哪些 3 XSS攻击的过程和原理 4 XSS的防御 5 可能会用到的XSS Payload资源 6 靶场训练 portswigger labs 6.1 没有任 ...