找回密码
 立即注册
首页 资源区 代码 Manim实现旋转变色特效

Manim实现旋转变色特效

全愉婉 3 天前
在数学动画的世界里,旋转与变色特效无疑是最能吸引观众眼球的元素之一。
今天,就让我们一起探索如何使用Manim框架来实现自定义的旋转变色特效吧!
1. 实现原理

Manim的动画魔法源于Animation类的interpolate_mobject方法。
这个方法通过alpha参数(0到1之间)控制动画进度,我们只需重写这个方法就能创造自定义特效:
  1. class RotateAndColor(Animation):
  2.     def __init__(
  3.         self,
  4.         mobject,
  5.         angle=TAU,
  6.         start_color=BLUE,
  7.         end_color=RED,
  8.         about_point=ORIGIN,
  9.         **kwargs
  10.     ):
  11.         """
  12.         构造函数。
  13.         Parameters:
  14.             mobject - 这是要进行动画的对象,例如一个几何形状、文本或其他任何 Manim 支持的对象
  15.             angle - 指定旋转的总角度,默认值为 TAU 即 360度
  16.             start_color - 动画开始时对象的颜色,默认蓝色
  17.             end_color - 动画结束时对象的颜色,默认为红色
  18.             **kwargs - 用于传递额外的关键字参数到父类Animation的构造函数中
  19.         """
  20.         # 调用父类Animation的构造函数,
  21.         # 将mobject和额外的关键字参数传递给父类,完成基本的初始化
  22.         super().__init__(mobject, **kwargs)
  23.         # 将传入的参数存储为类的属性,以便后续使用
  24.         self.angle = angle
  25.         self.start_color = start_color
  26.         self.end_color = end_color
  27.         self.about_point = about_point
  28.     def interpolate_mobject(self, alpha):
  29.         """
  30.         实现动画效果的核心方法。
  31.         Parameters:
  32.             alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度
  33.         """
  34.         pass
复制代码
接下来,实现同一个动画周期内同时控制旋转和颜色:
  1.     def interpolate_mobject(self, alpha):
  2.         """
  3.         实现动画效果的核心方法。
  4.         Parameters:
  5.             alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度
  6.         """
  7.         # 颜色插值
  8.         # 使用interpolate_color函数计算当前进度alpha下的颜色
  9.         # interpolate_color是Manim中的一个内置函数,用于在两个颜色之间进行插值
  10.         new_color = interpolate_color(self.start_color, self.end_color, alpha)
  11.         # 旋转角度计算
  12.         # 计算当前进度alpha下的旋转角度。
  13.         # 通过将alpha乘以总旋转角度self.angle,得到当前的旋转角度
  14.         current_angle = alpha * self.angle
  15.         # 应用变换
  16.         # 将mobject重置为动画开始时的状态
  17.         self.mobject.become(self.starting_mobject)
  18.         # 调用rotate方法,将mobject旋转current_angle角度,
  19.         # 旋转的中心点是self.about_point
  20.         self.mobject.rotate(current_angle, about_point=self.about_point)
  21.         # 将mobject的颜色设置为当前插值计算得到的颜色
  22.         self.mobject.set_color(new_color)
复制代码
上面的代码中已经加了详细的注释,总得来说,RotateAndColor类实现了一个同时进行旋转和颜色变化的动画效果。
它通过继承Animation类,利用Manim的动画系统,实现了对对象的旋转和颜色变化。
通过interpolate_mobject方法,根据动画进度alpha,动态计算旋转角度和颜色,从而实现平滑的动画效果。
2. 应用示例

实现了这个自定义的旋转变色动画(RotateAndColor)后,下面来实际使用看看效果如何。
2.1. 基础使用

在基础使用示例中,我们构造一个正方体,先快速旋转3圈,同时颜色由蓝变绿;
再慢速旋转半圈,同时颜色又绿变紫。
  1. class RotateColorSample01(ThreeDScene):
  2.     def construct(self):
  3.         self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
  4.         cube = Cube().set_fill(BLUE, opacity=0.8)
  5.         self.play(
  6.             RotateAndColor(
  7.                 cube,
  8.                 angle=3 * TAU,  # 旋转3圈
  9.                 start_color=BLUE,
  10.                 end_color=GREEN,
  11.                 run_time=2,
  12.             )
  13.         )
  14.         self.wait()
  15.         # 添加对比动画
  16.         self.play(
  17.             RotateAndColor(
  18.                 cube,
  19.                 angle=TAU / 2,  # 仅转半圈
  20.                 start_color=GREEN,
  21.                 end_color=PURPLE,
  22.                 run_time=2,
  23.             )
  24.         )
  25.         self.wait()
复制代码
1.gif

2.2. 模拟公转自转

下面再构造一个略微复杂点的示例,构造两个球形模拟太阳和地球,太阳自转同时变色;
地球绕着太阳公转,且在绕的过程中逐渐变色(可用来模拟白天黑夜)。
  1. class RotateColorSample02(ThreeDScene):
  2.     def construct(self):
  3.         self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
  4.         sun = Sphere(color=YELLOW).scale(1.2)
  5.         earth = Sphere(resolution=24).scale(0.4).shift(RIGHT * 3)
  6.         # 地球公转+太阳自转+色温变化
  7.         self.play(
  8.             RotateAndColor(
  9.                 sun,
  10.                 angle=TAU / 2,
  11.                 start_color=YELLOW,
  12.                 end_color=RED,
  13.                 rate_func=there_and_back,
  14.             ),
  15.             RotateAndColor(
  16.                 earth,
  17.                 angle=TAU,
  18.                 start_color=BLUE,
  19.                 end_color=GREEN,
  20.                 about_point=sun.get_center(),
  21.                 rate_func=linear,
  22.             ),
  23.             run_time=8,
  24.         )
  25.         self.wait()
复制代码
2.gif

3. 总结

通过上面介绍的方法,相信您已经掌握了制作专业级数学动画的核心技巧。
感兴趣的话,尝试修改示例代码中的参数,或者将旋转变色效果与缩放、位移等动画组合使用,创造出属于您的独特视觉效果!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册