manim边学边做--旋转
本篇介绍Manim中的两个旋转类的动画,名称差不多,分别是Rotate和Rotating。
Rotate类主要用于对图形对象进行指定角度、围绕特定点的精确旋转,适用于几何图形演示、物理模拟和机械运动展示等场景;
Rotating类则侧重于创建让对象围绕指定轴或点持续旋转的动画,用于动态图标、天体运动模拟和装饰性动态元素等场景。
1. 动画概述
1.1. Rotate
Rotate是一个用于对Mobject进行旋转的动画类。
它通过指定旋转角度、旋转轴等参数来实现精确的旋转效果,例如,它可以围绕特定点(如对象的中心或者自定义的点)进行旋转。
此外,还可以设置旋转的起始角度和终止角度,并且可以指定旋转的速率,通过控制动画运行的时间来调整旋转的快慢。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| mobject | Mobject | 要旋转的Mobject对象 |
| angle | float | 旋转角度,以弧度为单位指定 |
| axis | np.ndarray | 旋转轴,用向量表示 |
| about_point | [float] | 旋转中心 |
| about_edge | [float] | 指定边界框点的方向作为旋转中心 |
about_point和about_edge只有一个有效,当about_point为None时,about_edge才生效。
1.2. Rotating
Rotating更侧重于创建一个持续旋转的动画效果。
它会使Mobject一直围绕指定的轴或点进行旋转,通常用于创建动态的、循环的旋转场景。
它可以设置旋转的方向(顺时针或逆时针),并且可以方便地控制旋转的速度。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| mobject | Mobject | 要旋转的Mobject对象 |
| radians | np.ndarray | 旋转的弧度值 |
| axis | np.ndarray | 旋转轴 |
| about_point | [float] | 旋转中心 |
| about_edge | [float] | 指定边界框点的方向作为旋转中心 |
| rate_func | func | 速率函数,用于控制动画在时间上的进展速度 |
1.3. 两种旋转的区别与联系
Rotate 和 Rotating 有明显的区别和联系。
在区别方面,Rotate 重点在于精确控制旋转,它有明确的起始和终止角度设定,可以精准地让 Mobject 从一个角度旋转到另一个角度,适合一次性的、角度明确的旋转操作。
例如,将一个三角形从初始位置旋转 30 度来展示特定的几何关系。
而 Rotating 是让 Mobject 持续旋转,没有终止角度的限制,只要动画持续,就会一直围绕指定轴或点循环旋转,更适合用于需要持续动态旋转的场景,如一个不停旋转的风车。
它们的联系之处在于都用于实现旋转动画,都依赖于图形对象(Mobject)和旋转轴、旋转中心这些基本要素。
而在一些复杂的动画场景中,还可以配合使用,比如先用 Rotate 将物体旋转到一个特定位置,再用 Rotating 让其在该位置持续旋转。
2. 使用示例
下面通过示例来演示Rotate 和 Rotating动画的使用。
2.1. Rotate 时钟指针的旋转
该示例用箭头线段代表时钟指针,通过 Rotate 动画,围绕原点将指针从 12点位置旋转到 3点位置(即旋转 90 度,对应PI/2弧度)。
以此简单模拟时钟指针的转动情况,直观展现 Rotate 在模拟有明确角度变化场景下的应用。
d = Dot(color=BLUE)
c = Circle(color=YELLOW, radius=1)
self.add(d, c)
# 创建时钟指针(简单用线段表示)
hand = Arrow(ORIGIN, [0, 1, 0])
# 模拟时钟指针从 12 点位置旋转到 3 点位置
r_anim = Rotate(
hand,
angle=PI / 2,
axis=IN,
about_point=ORIGIN,
)
self.play(r_anim)

2.2. Rotating 风扇叶片旋转
以两个矩形表示风扇叶片,借助 Rotating 动画类,让叶片围绕其中心,沿着垂直屏幕向外的轴持续旋转,一圈又一圈,设定旋转一圈的时长为 4 秒。
很好地体现了 Rotating 用于创建持续旋转效果的功能,模拟风扇叶片不停转动的场景。
# 创建风扇叶片(用矩形表示)
b1 = Rectangle(height=0.2, width=2, color=BLUE_B)
b2 = Rectangle(height=2, width=0.2, color=BLUE_D)
vg = VGroup(b1, b2)
# 使用 Rotating 让风扇叶片持续绕中心旋转
r_anim = Rotating(
vg,
axis=OUT,
radians=TAU,
about_point=vg.get_center(),
run_time=4,
)
self.play(r_anim)

2.3. Rotate 和 Rotating 旋转门
用矩形作为旋转门的一扇门叶,先通过 Rotate 将门叶从关闭位置旋转到一个位置,
随后使用 Rotating 让门叶在打开位置以小角度围绕其左下角持续摆动,还借助 wiggle 速率函数营造摆动效果。
以此模拟旋转门打开后受外界因素影响产生摆动的场景,展示了两个动画类结合使用的灵活性。
# 创建旋转门的一扇门叶(用矩形表示)
door = Rectangle(
height=3,
width=2,
color=BLUE,
fill_opacity=0.2,
fill_color=YELLOW,
)
l = Line(UP * 2, DOWN * 2, stroke_width=1, color=GREEN)
self.add(door, l)
# 先使用 Rotate 将门叶从关闭位置旋转到打开 90 度位置
rotate_to_open = Rotate(
door,
axis=UP,
angle=PI / 4 + PI,
about_point=door.get_bottom(),
rate_func=rush_into,
)
# 然后使用 Rotating 让门叶在打开位置持续小角度摆动(模拟风或其他因素影响)
rotating_at_open = Rotating(
door,
axis=UP,
radians=PI / 8,
about_point=door.get_bottom(),
run_time=3,
rate_func=wiggle,
)
self.play(rotate_to_open)
self.play(rotating_at_open)

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(rotate.py),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--旋转的更多相关文章
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- css做旋转相册效果
css做旋转相册效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- 第一份开发工作,边学边做android
我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...
- 边学边做,简单的 GraphQL 实例
项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...
- LabVIEW Actor Framwork (2)________ 边学边做server&client
回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...
- 牛腩学ASP.NET CORE做博客(视频)
牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...
- 牛腩学用MUI做手机APP
斗鱼直播间直播学习撸码,最终目标是用MUI做一个手机APP(暂定android平台,攒钱买IPHONE 7SE!!!),直播内容含整个软件APP的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...
随机推荐
- EAS之WALT算法介绍
EAS调度器缘起 Linux内核的一直都使用完全公平调度器CFS(Completely Fair Scheduler)作为默认调度器,但是在使用中发现CFS如下几个问题. CFS主要是为了服务器性能优 ...
- 如何对 Vue 首屏加载实现优化 ?
首屏加载优化是对于 SPA 来说的 ,首次加载所有的 html css js 所需的文件 ,后面就不会因为用户对页面的操作而跳转页面 ,没有跳转页面如何展示不同的内容呢 ? 使用 Vue 的路由机制 ...
- 一图为你揭秘云数据库GaussDB管理平台亮点
云数据库GaussDB管理平台(TPOPS)是一款即开即用.稳定可靠.管理便捷的数据库运维管理平台.通过该平台,用户可以快速部署安装GauSSDB,实现智能化运维,大幅度提升运维和管理效率.一图带你揭 ...
- Top100(中)
Top100(中) 二叉树 94. 二叉树的中序遍历 int *res; void inorder(struct TreeNode *root, int *returnSize) { if (root ...
- Web渗透04_密码破解
账号密码是任何一个系统都必备的要素. 弱密码 123456 654321 112233 admin 等等 默认密码 Tomcat控制台: tomcat/tomcat 明文传输 http的明文传输,可以 ...
- element-ui带输入建议的input框踩坑
踩坑问题描述: 问题一: 获取到后端返回的数组,并将数组传入作为 results 传入 callback 后,焦点放在 输入框 上的时候,并未出现任何内容,只出现了一个不完整的空白框. 问题解决方案: ...
- 什么是SCI, SCIE, JCR和影响因子(IF)?
SCI(Scientific Citation Index):是美国科学信息研究所(ISI)编辑出版的引文索引类刊物,创刊于1964年.分印刷版.光盘版和联机板等载体.印刷版.光盘版从全球数万种期刊中 ...
- LeetCode题目练习记录 _数组和链表01 _20211007
LeetCode题目练习记录 _数组和链表01 _20211007 26. 删除有序数组中的重复项 难度简单2247 给你一个有序数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ...
- 利用 canvas 实现签名效果
利用 canvas 实现签名效果 使用插件 jSignature github:https://github.com/brinley/jSignature 如果再H5 中使用需要加载 flash ...
- [离线计算-Spark|Hive] 数据近实时同步数仓方案设计
背景 最近阅读了大量关于hudi相关文章, 下面结合对Hudi的调研, 设计一套技术方案用于支持 MySQL数据CDC同步至数仓中,避免繁琐的ETL流程,借助Hudi的upsert, delete 能 ...