本篇介绍Manim中的两个旋转类的动画,名称差不多,分别是RotateRotating

Rotate类主要用于对图形对象进行指定角度、围绕特定点的精确旋转,适用于几何图形演示、物理模拟和机械运动展示等场景;

Rotating类则侧重于创建让对象围绕指定轴或点持续旋转的动画,用于动态图标、天体运动模拟和装饰性动态元素等场景。

1. 动画概述

1.1. Rotate

Rotate是一个用于对Mobject进行旋转的动画类。

它通过指定旋转角度、旋转轴等参数来实现精确的旋转效果,例如,它可以围绕特定点(如对象的中心或者自定义的点)进行旋转。

此外,还可以设置旋转的起始角度和终止角度,并且可以指定旋转的速率,通过控制动画运行的时间来调整旋转的快慢。

它的主要参数有:

参数名称 类型 说明
mobject Mobject 要旋转的Mobject对象
angle float 旋转角度,以弧度为单位指定
axis np.ndarray 旋转轴,用向量表示
about_point [float] 旋转中心
about_edge [float] 指定边界框点的方向作为旋转中心

about_pointabout_edge只有一个有效,当about_pointNone时,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. 两种旋转的区别与联系

RotateRotating 有明显的区别和联系。

区别方面,Rotate 重点在于精确控制旋转,它有明确的起始和终止角度设定,可以精准地让 Mobject 从一个角度旋转到另一个角度,适合一次性的、角度明确的旋转操作。

例如,将一个三角形从初始位置旋转 30 度来展示特定的几何关系。

Rotating 是让 Mobject 持续旋转,没有终止角度的限制,只要动画持续,就会一直围绕指定轴或点循环旋转,更适合用于需要持续动态旋转的场景,如一个不停旋转的风车。

它们的联系之处在于都用于实现旋转动画,都依赖于图形对象Mobject)和旋转轴旋转中心这些基本要素。

而在一些复杂的动画场景中,还可以配合使用,比如先用 Rotate 将物体旋转到一个特定位置,再用 Rotating 让其在该位置持续旋转。

2. 使用示例

下面通过示例来演示RotateRotating动画的使用。

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边学边做--旋转的更多相关文章

  1. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  2. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  3. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  4. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  5. css做旋转相册效果

    css做旋转相册效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  6. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  7. 边学边做,简单的 GraphQL 实例

    项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...

  8. LabVIEW Actor Framwork (2)________ 边学边做server&client

    回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...

  9. 牛腩学ASP.NET CORE做博客(视频)

    牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...

  10. 牛腩学用MUI做手机APP

    斗鱼直播间直播学习撸码,最终目标是用MUI做一个手机APP(暂定android平台,攒钱买IPHONE 7SE!!!),直播内容含整个软件APP的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...

随机推荐

  1. urb中几个函数的使用

    usb_buffer_alloc(free) 说是为了更好的从名字看出这个函数真实做的事情:DMA coherency linux提供两种方式,来保证使用dma时,内存和硬件cache的一致性: us ...

  2. 墨天轮最受DBA欢迎的数据库技术文档-故障处理案例篇

    在之前发布的<墨天轮最受欢迎的技术文档-容灾备份篇>中,大家说想看故障处理案例篇的内容,这不!编辑部快马加鞭给大家整理来了,希望能够帮助到大家. 数据库故障可能出现在内存.网络.CPU.硬 ...

  3. vant2 List 组件 下拉加载 onLoad

    ps:loading finished onLoad 两个变量一个函数 : async onLoad() { console.log("onload"); // 异步更新数据 // ...

  4. GDOI绝望记——人生第一次省选普及

    时光匆匆,如白驹过隙. 转眼之间,我一在OI之路上走了2年半了.. 岁月不饶人,我却在不经意间饶了岁月. 自己到底是不是不如别人,这,是取决于自己的心态吧 Preface 人生中第一次去深圳(应该是吧 ...

  5. SpringBoot2.0 整合 JWT 框架后台生成token

    一.传统Session认证 1.1.认证过程 1.用户向服务器发送用户名和密码.2.服务器验证后在当前对话(session)保存相关数据.3.服务器向返回sessionId,写入客户端 Cookie. ...

  6. linq+lambda+delegate,从list中查找到满足匹配条件的所有数据索引值

    linq的扩展方法中有FindIndex,FindLastIndex两个方法可以查找满足条件的首个和最后一个数据的索引值,利用delegate将匹配条件的方法传入FindAllIndex,查找满足匹配 ...

  7. Codeforces Round 987 (Div. 2)

    Codeforces Round 987 (Div. 2) 总结 A 常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的 \(a\ ...

  8. VL4AD:让语义分割认识未知类别,无需额外数据和训练的OOD语义分割 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: VL4AD: Vision-Language Models Improve Pixel-wise Anomaly Detection 论文地址 ...

  9. Chrome控制台中network底部概要参数

    概要参数 1.requests => 资源请求总数: 2.transferred => 网络加载资源大小: 3.resources => 页面所有资源总大小(包含网络资源.浏览器缓存 ...

  10. Python基础:Python的变量和对象

    一.基本原理  Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.我们举个例子来说,Python是如何来处理的. x = 'blue' y = 'green' z = x 当p ...