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 线程池获取池中所有线程列表的方法
在Java中,获取线程池中所有线程列表并不是一个直接支持的功能,因为线程池的设计通常是为了隐藏和管理底层的线程细节,从而提供更高层次的抽象和并发控制能力.然而,通过一些反射和技巧,我们仍然可以获取到线 ...
- URL是什么
URL是什么 URL(Uniform Resource Locator,统一资源定位器) URL的组成: 协议://{域名|主机名|IP}:端口/路径/文件名?参数#锚点 协议 Scheme/Prot ...
- v-if的使用方式
一.语法 其中<span></span>可以换成<div></div>, <div></div>的可以换成<templet ...
- 我用Replicate训练了个纹身Flux AI LORA模型,分享下经验
# 我用Replicate训练了个纹身AI模型,分享下经验 ## 起因 最近一直在研究AI辅助设计,正好我对纹身设计特别感兴趣.经过一段时间摸索,用Replicate平台训练了一个还不错的纹身设计模型 ...
- 【JVM第3课】运行时数据区
运行时数据区结构图如下: 可分为 5 个区域,分别是方法区.堆区.虚拟机栈.本地方法栈.程序计数器.这里大概介绍一下各个模块的作用,会在后面的文章展开讲. 类加载子系统会把类信息加载到方法区,程序运行 ...
- Kubernetes 中实现 MySQL 的读写分离
Kubernetes 中实现 MySQL 的读写分离 在 Kubernetes 中实现 MySQL 的读写分离,可以通过主从复制架构来实现.在这种架构中,MySQL 主节点(Master)负责处理所有 ...
- 记录一下opencv-contrib的编译使用
一.来由 公司需求进行多图拼接算法,在opencv提供的Stitcher类当中默认的算子是ORB,我想尝试使用SIFT和SURF算子,经过一番查找发现这两个算子需要opencv的超集库支持--&quo ...
- ARC121E Directed Tree
ARC121E Directed Tree 有意思的容斥加树 dp. 思路 \(a_i\) 可以是除去 \(i\) 祖先之外的所有点,考虑 \(a_i\) 的逆排列. 每一个 \(i\) 在正排列里都 ...
- 一个.NET开源、快速、功能丰富的跨平台阅读服务器
前言 今天大姚给大家分享一个基于.NET开源的快速.功能丰富的跨平台阅读服务器,它的设计初衷是提供一个全面的解决方案,满足用户的所有阅读需求.用户可以设置自己的服务器,并与朋友和家人分享阅读收藏:Ka ...
- (Python基础教程之三)Python代码中添加注释
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...