qq5464642 发表于 2025-2-6 23:37:21

manim边做边学--缩放变换

使用 Manim 进行动画创作时,缩放变换是一项强大且实用的功能。
当我们处理复杂的科学模型可视化、数学原理演示时,缩放变换可以帮助我们在不改变元素位置关系的基础上,突出关键信息,引导观众聚焦于特定的细节。
比如在数学教学动画中,通过对几何图形的缩放,可以清晰地展示图形的比例变化与性质特征。
本篇将介绍Manim中的两个用于缩放变换的类:

[*]ScaleInPlace:用于原地的缩放强调,侧重于对象大小的改变而位置不变
[*]ShrinkToCenter:侧重于将对象向屏幕中心收缩直至消失,适用于场景转换、元素移除等
1. 动画概述

1.1. ScaleInPlace

当你想要强调某个对象的放大或缩小效果,同时保持该对象在原位置进行缩放操作时,可以使用 ScaleInPlace。
例如,在讲解数学公式的推导过程中,需要突出显示某个公式的一部分,你可以将这部分进行原地缩放,以吸引观众的注意力。
它也适用于一些元素的局部放大展示,使观众能更清楚地看到细节。
该类实现的是原地缩放效果,对象的中心点不会发生位移,仅在大小上进行缩放。
可以通过调整缩放比例来控制缩放的程度,能够灵活地将对象放大或缩小到所需的尺寸。
它的参数主要有:
参数名称类型说明mobjectMobject要进行缩放操作的对象scale_factorfloat缩放比例因子1.2. ShrinkToCenter

ShrinkToCenter适合用于物体消失时的动画效果,它能让对象从当前大小逐渐缩小直至消失在屏幕的中心位置。
例如,在展示一个元素被移除或销毁的过程中,ShrinkToCenter 可以生动地表现出该元素被 “收纳” 或 “吸收” 到屏幕中心的效果。
对于一些具有层级关系的元素,如果想要表示下层元素被上层元素吸收或覆盖时,也可以使用 ShrinkToCenter 让下层元素平滑地收缩到中心,模拟这种层级覆盖的视觉感受。
该类的特点是对象在收缩过程中向屏幕中心收缩,给人一种被 “吸进” 屏幕中心的视觉效果。
它的动画过程是渐进的,会逐渐缩小对象,直到对象完全消失或达到最小尺寸(可根据配置),这个过程的视觉效果可以根据持续时间和缩放速度的设置而有所不同。
它的参数主要有:
参数名称类型说明mobjectMobject要进行向中心收缩操作的对象2. 使用示例

ScaleInPlace和ShrinkToCenter使用起来比较简单直观,也没有什么复杂的参数。
下面的示例主要演示在哪些实际的场景中可以使用这两个类。
2.1. 原子核的展示

这个示例创建了一个代表原子核的蓝色圆形。
先将其显示,随后使用 ScaleInPlace 动画将其放大 3 倍,以此突出原子核,帮助观众更清晰地关注重点内容。
nucleus = Circle(    radius=0.5,    fill_opacity=1,    color=BLUE,)self.play(Create(nucleus))self.wait()# 放大原子核,使其更加突出self.play(ScaleInPlace(nucleus, 3))
2.2. Logo的展示

这个示例针对公司 logo 展示场景,通过 ImageMobject 加载 logo 并设为 0.5 倍初始大小后淡入。
等待 1 秒,利用 ScaleInPlace 动画将 logo 放大 3 倍,从而在开场时吸引观众目光。
logo = ImageMobject("./common/亚原logo.jpg")logo.scale(0.5)# 初始缩放比例self.play(FadeIn(logo))self.wait()# 放大 logo 以吸引观众的注意力self.play(ScaleInPlace(logo, 3))
2.3. 游戏中的生命值

这个示例演示在游戏结束的情境下,创建红色正方形代表生命值方块。
先显示出来,1 秒后使用 ShrinkToCenter 动画使其收缩至中心消失,模拟了生命值损失的效果。
life_block = Square(    side_length=2,    fill_opacity=0.6,    color=RED,)self.play(Create(life_block))self.wait()# 让生命值方块收缩到中心消失,模拟失去生命值的效果self.play(ShrinkToCenter(life_block))
2.4. 提示消息的消失

这个示例演示了信息提示场景,先创建白色文本作为提示信息并写出。
等待 2 秒后,运用 ShrinkToCenter 动画让文本收缩至中心消失,实现了提示信息自然消失的动画效果。
s = "这个一个提示信息"info_text = Text(    f"{s} !",    t2g={s: },)self.play(Write(info_text))self.wait()# 使提示文本收缩至中心消失self.play(ShrinkToCenter(info_text))
3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(scale.py),
下载地址: 完整代码 (访问密码: 6872)
页: [1]
查看完整版本: manim边做边学--缩放变换