manim边学边做--移动动画
在Manim中,其实直线移动的动画非常简单,每个Mobject对象都有animate属性,
通过obj.animate.shift()或者obj.animate.move_to()很容易将对象从一个位置移往另一个位置。
不过,如果要更复杂的移动路线,那么animate属性的移动方法就无法满足了。
本篇介绍Manim中的两个处理复杂移动动画的类MoveAlongPath和PhaseFlow。
MoveAlongPath能使图形对象沿着指定路径(如贝塞尔曲线等)移动,并且可精细调节运动参数。
而且它易于和其他动画组合,主要用于动画制作、路径演示和物理轨迹模拟等场景的动画类。
PhaseFlow是一个基于向量场和微分方程,通过数值计算求解轨迹的移动动画。
它可以展示相空间中系统状态动态演化过程,多用在物理系统模拟、控制系统分析和生物系统建模等领域。
1. 动画概述
1.1. MoveAlongPath
MoveAlongPath 的核心特点是能让一个 Mobject(manim 中的图形对象)沿着指定的路径进行移动。
这个路径可以是通过各种方式定义的,比如使用贝塞尔曲线、折线等。
比如,你可以定义一个复杂的二次贝塞尔曲线作为路径,然后让一个圆形 Mobject 沿着这条曲线运动。
此外,它还允许你对运动的参数进行精细控制,可以设置运动的速度,通过改变速度参数来实现匀速运动或者变速运动。
比如,你可以让一个对象开始运动较慢,然后逐渐加速沿着路径前进,还可以指定运动的起始点和结束点在路径上的位置,这样就能灵活地控制对象在路径的哪一段进行运动。
最后,MoveAlongPath 可以很方便地与其他动画效果组合使用。
比如,在对象沿着路径运动的同时,可以结合旋转动画,让对象在移动过程中自身还进行旋转,从而创造出更加复杂和生动的动画效果。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| mobject | Mobject | 要移动的Mobject对象 |
| path | VMobject | 指定移动的路径 |
| suspend_mobject_updating | bool | 控制是否暂停mobject的更新 |
suspend_mobject_updating参数如果为True,则在动画插值过程中暂停mobject的更新;
如果为False,则继续更新。
1.2. PhaseFlow
PhaseFlow 是和动力系统紧密相关的动画效果类。
它是基于向量场来工作的,这个向量场通常是由一个或多个微分方程定义的。
比如,对于一个简单的二维动力系统,可能有$ \frac{dx}{dt}=f(x,y) \(和\) \frac{dy}{dt}=g(x,y) $这样的微分方程组来定义向量场,PhaseFlow 会根据这些方程计算相空间中的轨迹。
PhaseFlow 主要用于展示相空间(Phase Space)中系统状态的动态演化过程。
相空间是一个抽象的空间,其坐标轴可以代表系统的状态变量(如位置、速度等)。
PhaseFlow 能够以动画的形式展示从不同初始状态出发的轨迹是如何在相空间中随着时间流动的,并且这种展示是连续而平滑的。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| mobject | Mobject | 要移动的Mobject对象 |
| function | func | 定义相流的动态行为 |
| virtual_time | float | 虚拟时间,用于在计算相流轨迹时确定时间步长等相关计算 |
| suspend_mobject_updating | bool | 控制是否暂停mobject的更新 |
| rate_func | func | 控制动画的速率 |
function参数通常基于给定的微分方程来计算相空间中的轨迹变化。
2. 使用示例
下面通过示例来演示MoveAlongPath和PhaseFlow的应用场景。
示例中的应用场景是简化之后的,目的是演示MoveAlongPath和PhaseFlow的使用方式。
2.1. 模拟行星绕太阳公转
该示例使用MoveAlongPath创建了一个行星绕太阳公转的动画,通过定义椭圆轨道路径,让行星沿着该路径运动,模拟了天体运动场景。
# 创建太阳
sun = Dot(color=YELLOW, radius=0.5)
# 创建椭圆轨道
orbit_path = Ellipse(width=4, height=2)
# 创建行星
planet = Dot(color=BLUE, radius=0.2)
self.add(sun, orbit_path, planet)
# 让行星沿着椭圆轨道运动
self.play(
MoveAlongPath(planet, orbit_path),
run_time=5,
rate_func=linear,
)

2.2. 展示函数曲线绘制过程
这个示例利用MoveAlongPath展示了函数曲线的绘制过程,通过沿着定义好的函数曲线路径移动一个点,帮助理解函数的形状。
# 定义函数(这里以y = x^2为例)
def f(x):
return x**2
graph = axes.plot(
f,
x_range=[-2.5, 2.6],
color=GREEN,
stroke_width=2,
)
self.play(Create(graph))
# 创建一个点沿着曲线运动
moving_dot = Dot(color=YELLOW)
self.play(
MoveAlongPath(moving_dot, graph),
run_time=5,
rate_func=linear,
)

2.3. 展示简单谐振子的相空间轨迹
这个示例借助PhaseFlow展示了简单谐振子在相空间中的轨迹,根据谐振子的微分方程定义了向量场,动画展示了系统状态在相空间中的变化。
# 定义谐振子的微分方程
def harmonic_oscillator_deriv(state):
# x, v = state
dxdt = state[1]
dvdt = -1 * state[0]
return np.array([dxdt, dvdt, 0])
# 创建相空间中的点(初始位置)
initial_state = np.array([1.0, 0.0])
state_dot = Dot(point=axes.c2p(*initial_state), color=YELLOW)
self.add(state_dot)
# 使用PhaseFlow展示相空间轨迹
self.play(
PhaseFlow(
harmonic_oscillator_deriv,
state_dot,
virtual_time=5,
rate_func=linear,
),
run_time=5,
)

2.4. 模拟单摆运动在相空间轨迹
这个示例使用 PhaseFlow 根据单摆的微分方程来展示其在相空间中的轨迹,以此模拟单摆运动在相空间的动态行为。
# 定义单摆的微分方程
def pendulum_deriv(state):
theta, omega = state[:2]
g = 9.8 # 重力加速度
L = 1.0 # 单摆长度
dtheta_dt = omega
domega_dt = -g / L * np.sin(theta)
return np.array([dtheta_dt, domega_dt, 0])
# 创建相空间中的点(初始位置)
# 初始角度为 45 度,初始角速度为 0
initial_state = np.array([np.pi / 4, 0.0])
state_dot = Dot(point=axes.c2p(*initial_state), color=YELLOW)
self.add(state_dot)
# 使用 PhaseFlow 展示单摆相空间轨迹
self.play(
PhaseFlow(
pendulum_deriv,
state_dot,
virtual_time=5,
rate_func=linear,
),
run_time=5,
)

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(move.py),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--移动动画的更多相关文章
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- Android 中加载几百张图片做帧动画防止 OOM 的解决方案
Android 中加载几百张图片做帧动画防止 OOM 的解决方案 最近,项目中有个需求:就是要做一个帧动画,按理说这个是很简单的!但是我能说这个帧动画拥有几百张图片吗?...... 填坑一 ---帧动 ...
- UIView封装动画--iOS利用系统提供方法来做关键帧动画
iOS利用系统提供方法来做关键帧动画 ios7以后才有用. /*关键帧动画 options:UIViewKeyframeAnimationOptions类型 */ [UIView animateKey ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- jQuery的一些基本的函数和用jQuery做一些动画操作
jQuery是对js的封装,因为js有一些不方便的地方.所以,jQuery才会去对js进行封装. jQuery对于标签元素的获取 $('div')或$('li') <!DOCTYPE html& ...
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...
- 第一份开发工作,边学边做android
我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...
- 用CSS3做3D动画的那些事
年会做了个3D变换的抽奖系统,在这里分享下通过CSS3制作3D效果的心得.抽奖系统虽然够炫酷,可惜抽的时候出了点bug,好几百人啊我的小心脏啊.虽然这个锅后面甩给会场的老爷电脑了(手动白眼). 首先介 ...
随机推荐
- 妙用编辑器:使用Notepad--正则表达式从命令结果报文快速生成新命令
应用场景 日常工作中有些维护场景,比如检查设备状态,执行查询命令后,得到精简结果报文,如果要更深入的检查状态,可能还要执行其他命令,逐个对象进行查询,这里涉及到快速从报文生成查询指令的功能. 比如有如 ...
- KubeSphere 3.4.0 发布:支持 K8s v1.26
2023 年 07 月 26 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.4.0 正式发布! 让我们先简单回顾下之前三个大版本的主要变化: KubeSphere 3. ...
- 使用 Cursor 和 Devbox 快速开发基于 Rust 的 WASM 智能合约
本教程以一个智能合约(使用 NEAR 的一个官方 Fungible Tokens 来实现)的例子来介绍一下 Devbox 的强大功能,轻松构建环境,轻松发布. NEAR 是一个去中心化的应用平台,使用 ...
- v-bind属性,v-model属性
一.v-bind v-bind动态绑定指令 默认情况下标签自带属性的值是固定的,可以使用v-bind:'需要绑定的值'='表达式' 所谓动态绑定动态的含义是我们不必修改页面template模板的代码, ...
- [Go] 如何妥善处理 TCP 代理中连接的关闭
如何妥善处理 TCP 代理中连接的关闭 相比较于直接关闭 TCP 连接,只关闭 TCP 连接读写使用单工连接的场景较少,但通用的 TCP 代理也需要考虑这部分场景. 背景 今天在看老代码的时候,发现一 ...
- hadoop运行原理
包括HDFS和Mapreduce两部分. 1)HDFS自动保存多个副本,移动计算.缺点是小文件存取占用namenode内存,写入只支持追加,不能随机修改. 它存储的逻辑空间称为block,文件的权限类 ...
- Min-25 筛小记
Min-25 筛 参考 \(\text{OI-Wiki}\) 和 2018 集训队论文 朱震霆<一些特殊的数论函数求和问题>. \(\text{Min-25}\) 的本质是埃式筛和数论分块 ...
- 如何在原生鸿蒙APP中使用RN的bundle包
一.创作背景 上一篇博客中,我给大家分享了如何创建一个RN的项目,并且解决了其中的问题点,成功打出了Bundle包.接下来就是我给大家分享一下,如何在原生鸿蒙项目中使用那个Bundle包,这一篇分享完 ...
- Nuxt.js 应用中的 vite:configResolved 事件钩子
title: Nuxt.js 应用中的 vite:configResolved 事件钩子 date: 2024/11/17 updated: 2024/11/17 author: cmdragon e ...
- 使用WebRTC技术搭建小型的视频聊天页面
目录 目录 参考资料 什么是WebRTC? 能做什么? 架构图 个人理解(类比) 核心知识点 核心知识点类比 ICE框架 STUN(协议) NAT(网络地址转换) TURN SDP(会话描述协议) W ...