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
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
随机推荐
- Windows 使用 Mingw-w64 配置GCC套件
Mingw-w64里的gcc和g++应该是很多人常用的编译工具.但是他的下载资源很乱,不好找(注意:MinGW和MinGW-w64是同宗同源的两款软件!),要么就是版本太老.SourceForge上有 ...
- v-bind属性,v-model属性
一.v-bind v-bind动态绑定指令 默认情况下标签自带属性的值是固定的,可以使用v-bind:'需要绑定的值'='表达式' 所谓动态绑定动态的含义是我们不必修改页面template模板的代码, ...
- 关于如何更改Cuda的版本的一些事情
1. 网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片 ...
- 使用Roslyn的源生成器生成DTO
前言 源生成器的好处很多, 通过在编译时生成代码,可以减少运行时的反射和动态代码生成,从而提高应用程序的性能, 有时候需要对程序AOT以及裁剪编译的dll也是需要用SG来处理的. 我们开发程序应该都绕 ...
- 网站免费https加密教程
为网站实现HTTPS加密可以大大提高网站的安全性和用户信任度.以下是一个详细的免费HTTPS加密教程: 一.选择免费SSL证书提供商 JoySSL:这是目前国内为数不多的国产CA服务商打造的自主品牌S ...
- 新型大语言模型的预训练与后训练范式,阿里Qwen
前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的.公开权重的大型语言模型.最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内 ...
- 理解Flink之三Transformation
Transformation 是 Flink操作的底层实现,无论是map还是Flatmap. DataStream类中包含两个变量: StreamExecutionEnvironment Transf ...
- 如何正确使用 RMQ
序列分块.设块长为 \(B\).每块预处理出最大值.对于询问 \([l, r]\),答案就是整块最大值和散块最大值拼起来.答案显然是 \(O(n) \sim O(\dfrac{n}{B} + B)\) ...
- a标签与Blob下载文件的区别和获取文件下载进度
文件下载的几种方式. 大家都做过文件下载,无非就是通过a标签给定一个href. 用户点击下载按钮. 或者使用Blob的方式进行下载. 这两种是很常见的,也是我们平时做使用最多的方式. 那么我们知道这2 ...
- React使用useRef调用子组件方法
前情 公司前端主技术栈是react系,最近在提取组件的时候想到vue可以通过ref获取子组件,再调用子组件的方法,于是想在react中实现同样效果. 实现原理 父组件调用useRef获取ref对象,再 ...