manim边做边学–动画更新

今天介绍Manim中用于动画更新的3个类 ,分别是:

  1. UpdateFromFunc:根据自定义的函数来动态更新 Mobject 的属性
  2. UpdateFromAlphaFunc:根据动画的进度来平滑地改变 Mobject 的属性
  3. MaintainPositionRelativeTo:保持多个 Mobject 之间的相对位置关系

3个类 分别从自定义更新、基于进度的过渡以及相对位置保持这三个重要方面,为 Manim 动画的创作提供有力的帮助。

1. 动画概述

1.1. UpdateFromFunc

UpdateFromFunc赋予动画极高的自定义能力。

主要作用是允许用户依据自定义的函数来动态更新 Mobject 的属性。

这一灵活性使得它在各种复杂的动画场景中都能发挥作用,无论是模拟物理过程中物体的动态变化,还是实现复杂的交互动画效果,都能通过定义合适的更新函数来实现对 Mobject 的精确控制,从而创造出符合特定需求的动画效果。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 要应用更新函数的对象
update_function func 定义如何更新 mobject 的状态的函数
suspend_mobject_updating bool 用于暂停或恢复 mobject 的更新操作

1.2. UpdateFromAlphaFunc

UpdateFromAlphaFunc专注于基于动画进度的属性更新,alpha 值代表了动画的完成度,范围从 0 到 1

利用这个类,用户可以根据动画的进度来平滑地改变 Mobject 的属性,例如淡入淡出、缩放、旋转等过渡效果。

这种基于进度的更新方式使得动画过渡自然流畅,与整个动画的时间线紧密结合,特别适合用于创建需要精准控制过渡效果的动画场景。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 要进行更新操作的对象
update_function func 根据动画进度(alpha 值)对 Mobject 进行相应的更新操作
suspend_mobject_updating bool 用于暂停或恢复 mobject 的更新操作

1.3. MaintainPositionRelativeTo

MaintainPositionRelativeTo的核心作用是保持多个 Mobject 之间的相对位置关系。

在复杂的动画场景中,常常需要确保某些对象之间的位置关系在动画过程中保持固定,比如一个物体围绕另一个物体运动,或者一个图标始终跟随某个特定对象移动。

这个类能够自动处理这些相对位置的逻辑,开发者无需手动计算和更新每个对象的位置,大大简化了动画的实现过程,使整个场景在动画过程中保持逻辑一致性和视觉上的合理性。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 需要保持相对位置的对象
tracked_mobject Mobject 被跟踪的对象,mobject 会相对于 tracked_mobject 来维持位置关系

2. 使用示例

这3个动画类的使用不是那么直观,下面通过简单示例来演示如何使用这3个类。

2.1. UpdateFromFunc 正方形匀速旋转

首先构建一个函数square_rotation用来匀速旋转图形,然后通过UpdateFromFunc将图形与函数关联起来。

这样,在run_time时间内,Manim会不断调用square_rotation函数来旋转图形。

```python
# 创建一个正方形
s = Square()
self.add(s)

def square_rotation(square):
    square.rotate(PI / 100)

self.play(UpdateFromFunc(s, square_rotation), run_time=3)
```

manim边做边学--动画更新

2.2. UpdateFromAlphaFunc 圆形逐渐变色

首先构造一个控制颜色变化的函数circle_color,这个函数根据alpha值(也就是动画执行的进度)来逐渐更新图形颜色。

通过UpdateFromAlphaFunc将图形和函数关联起来,使得颜色随着动画的进度逐渐变化。

```python
# 创建一个圆形
c = Circle()
self.add(c)

def circle_color(circle, alpha):
    # 基于 alpha 值更新圆形的颜色
    new_color = interpolate_color(BLUE, RED, alpha)
    circle.set_color(new_color)

# 使用 UpdateFromAlphaFunc 进行动画
self.play(UpdateFromAlphaFunc(c, circle_color), run_time=3)
```

manim边做边学--动画更新

2.3. MaintainPositionRelativeTo 固定两个元素的相对位置

首先构造两个图形CircleSquare,然后在动画中只移动Circle的位置。

同时用MaintainPositionRelativeTo来保持SquareCircle的相对位置,

这样,Square会随着Circle一起移动,并保持两者相对位置不变。

```python
c = Circle().shift(UP + LEFT * 2)
s = Square().next_to(c, DOWN)
self.add(c, s)

self.play(
    c.animate.shift(RIGHT * 3),
    MaintainPositionRelativeTo(s, c),
    run_time=2,
)
```

manim边做边学--动画更新

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(anim_update.py),

下载地址: 完整代码 (访问密码: 6872)

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6687.html

(0)
LomuLomu
上一篇 2025 年 1 月 16 日
下一篇 2025 年 1 月 16 日

相关推荐

  • GreatSQL temp文件占用时长分析

    GreatSQL temp文件占用时长分析 GreatSQL DBA在日常工作中可能会遇到这种情况,存在一个 InnoDB 引擎下的 temp_x.ibt 文件很大,但是却无法确定这个文件是什么时间由哪个连接建立的,难以支撑后续定位问题,今天这篇文章彻底讲明白这个问题。 现象:发现一个实例下面(4406端口对外提供服务的实例)temp文件很大,如下所示: `…

    2025 年 1 月 12 日
    62300
  • Java语言程序设计——篇十一(3)

    🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳 您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻 集合——Set Set接口及实现类 HashSet类 实战演练 用Set对象实现集合操作 TreeSet类 实战演练 实战演练 对象顺序 实战演练 综…

    2024 年 12 月 31 日
    57800
  • Java技术新视野——Java实时大数据处理赋能车联网协同驾驶的实践探索(197)

    ✨亲爱的技术爱好者们,诚挚欢迎访问【云端科技驿站】!在这个数字化浪潮奔涌的时代,我们致力于打造一个融合创新技术与深度思考的知识分享平台。这里不仅有前沿的技术解析,更期待您带来独到见解,让我们携手在科技海洋中扬帆远航!✨全网平台统一标识:云端科技驿站一、加入【技术精英圈】快速通道1:【云端技术交流圈】快速通道2:【CSDN技术创作营】二、核心专栏推荐:1. 【…

    2025 年 5 月 13 日
    39800
  • 解决Java运行时版本不兼容导致的UnsupportedClassVersionError问题

    1、问题现象描述 在使用IntelliJ IDEA将Spring Boot项目打包为JAR文件后,通过命令行运行该JAR时出现以下错误提示:线程”main”中出现异常:java.lang.UnsupportedClassVersionError: com/automation/hweb/HwebApplication的类文件版本(61.0)超过了当前Java…

    2025 年 5 月 19 日
    49700
  • HashMap 在高并发场景下可能出现的性能问题以及如何规避这些问题

    JDK1.8 之前 HashMap 底层是 数组和链表, 之后在之前基础上加上红黑树。相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。 HashMap 在容量不…

    未分类 2025 年 1 月 6 日
    59000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信