1.manim边学边做--三维图形的场景类
2.【manim动画教程】-- 安装
3.【manim动画教程】-- 基本图形
4.【manim动画教程】-- 坐标系
5.【manim动画教程】-- 文本样式
6.【manim动画教程】-- 文字和公式
7.【manim动画教程】-- 图形样式
8.【manim动画教程】--相机
9.【manim动画教程】--高级动画效果
10.【manim动画教程】--常用动画效果
11.【manim】之滚动字幕
12.【manim】之圆规动画
13.【manim】之目录动画
14.manim边学边做--DecimalNumber
15.manim边学边做--Integer
16.manim边学边做--Variable
17.manim边学边做--Title
18.manim边学边做--BulletedList
19.manim边学边做--SingleStringMathTex
20.manim边学边做--MathTex
21.manim边学边做--Tex
22.manim边学边做--Text
23.manim边学边做--Paragraph
24.manim边学边做--MarkupText
25.manim边学边做--Code
26.manim边学边做--Matrix
27.manim边学边做--Table
28.manim边学边做--点
29.manim边学边做--圆形类
30.manim边学边做--圆弧形
31.manim边学边做--直线类
32.manim边学边做--带箭头直线
33.manim边学边做--曲线类
34.manim边学边做--角度标记
35.manim边学边做--常用多边形
36.manim边学边做--通用多边形
37.manim边学边做--弧形多边形
38.manim边学边做--空心多边形
39.manim边学边做--图形间集合关系
40.manim边学边做--形状匹配
41.manim边学边做--无向图
42.manim边做边学--有向图
43.manim边做边学--数轴
44.manim边做边学--直角平面
45.manim边做边学--复数平面
46.manim边学边做--极坐标平面
47.manim边学边做--通用二维坐标系
48.manim边做边学--通用三维坐标系
49.manim边学边做--三维的点和线
50.manim边学边做--立方体和棱柱体
51.manim边做边学--圆锥
52.manim边做边学--球体
53.manim边做边学--圆环面
54.manim边做边学--圆柱体
55.manim边做边学--曲面
56.manim边做边学--多面体
57.manim边做边学--文字的创建与销毁
58.manim边做边学--图形的创建与销毁
59.manim边做边学--淡入淡出
60.manim边学边做--渐变生长
61.manim边学边做--突出显示
62.manim边学边做--旋转
63.manim边学边做--移动动画
64.manim边学边做--同伦变换
65.manim边学边做--改变动画速度
66.manim边做边学--动画轨迹
67.manim边做边学--动画组合
68.manim边做边学--动画更新
69.manim边做边学--动画联动
70.manim边做边学--缩放变换
71.manim边做边学--交替变换
72.manim边做边学--淡入淡出变换
73.manim边学边做--时针方向变换
74.manim边学边做--局部变换
75.manim边学边做--通用变换
76.manim边学边做--相机Camera简介
77.manim边学边做--标准相机
78.manim边学边做--场景Scene简介
79.manim边学边做--局部缩放的场景类
80.manim边学边做--向量相关的场景类
81.manim边学边做--线性变换的场景类
82.manim边学边做--移动相机的场景类
83.Manim实现线条发光效果
84.Manim:动画制作背后的魔法
85.manim 动画效果总结
86.manim变换效果总结
87.Manim动画渲染:从代码到屏幕的幕后故事
88.轻松掌握Manim的.animate语法:让动画编程更简单
89.Manim实现图像变形特效
90.
Manim实现旋转变色特效
91.manim边做边学--显函数图像
92.manim边做边学--隐函数图像
93.manim边做边学--参数化曲线
94.Manim中三种函数图像类的比较
95.掌握ChangeSpeed类:让数学动画速度随心而动!
在数学动画的世界里,旋转与变色特效无疑是最能吸引观众眼球的元素之一。
今天,就让我们一起探索如何使用Manim
框架来实现自定义的旋转变色特效吧!
1. 实现原理
Manim
的动画魔法源于Animation
类的interpolate_mobject
方法。
这个方法通过alpha
参数(0到1之间)控制动画进度,我们只需重写这个方法就能创造自定义特效:
class RotateAndColor(Animation):
def __init__(
self,
mobject,
angle=TAU,
start_color=BLUE,
end_color=RED,
about_point=ORIGIN,
**kwargs
):
"""
构造函数。
Parameters:
mobject - 这是要进行动画的对象,例如一个几何形状、文本或其他任何 Manim 支持的对象
angle - 指定旋转的总角度,默认值为 TAU 即 360度
start_color - 动画开始时对象的颜色,默认蓝色
end_color - 动画结束时对象的颜色,默认为红色
**kwargs - 用于传递额外的关键字参数到父类Animation的构造函数中
"""
# 调用父类Animation的构造函数,
# 将mobject和额外的关键字参数传递给父类,完成基本的初始化
super().__init__(mobject, **kwargs)
# 将传入的参数存储为类的属性,以便后续使用
self.angle = angle
self.start_color = start_color
self.end_color = end_color
self.about_point = about_point
def interpolate_mobject(self, alpha):
"""
实现动画效果的核心方法。
Parameters:
alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度
"""
pass
接下来,实现同一个动画周期内同时控制旋转和颜色:
def interpolate_mobject(self, alpha):
"""
实现动画效果的核心方法。
Parameters:
alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度
"""
# 颜色插值
# 使用interpolate_color函数计算当前进度alpha下的颜色
# interpolate_color是Manim中的一个内置函数,用于在两个颜色之间进行插值
new_color = interpolate_color(self.start_color, self.end_color, alpha)
# 旋转角度计算
# 计算当前进度alpha下的旋转角度。
# 通过将alpha乘以总旋转角度self.angle,得到当前的旋转角度
current_angle = alpha * self.angle
# 应用变换
# 将mobject重置为动画开始时的状态
self.mobject.become(self.starting_mobject)
# 调用rotate方法,将mobject旋转current_angle角度,
# 旋转的中心点是self.about_point
self.mobject.rotate(current_angle, about_point=self.about_point)
# 将mobject的颜色设置为当前插值计算得到的颜色
self.mobject.set_color(new_color)
上面的代码中已经加了详细的注释,总得来说,RotateAndColor
类实现了一个同时进行旋转和颜色变化的动画效果。
它通过继承Animation
类,利用Manim
的动画系统,实现了对对象的旋转和颜色变化。
通过interpolate_mobject
方法,根据动画进度alpha
,动态计算旋转角度和颜色,从而实现平滑的动画效果。
2. 应用示例
实现了这个自定义的旋转变色动画(RotateAndColor
)后,下面来实际使用看看效果如何。
2.1. 基础使用
在基础使用示例中,我们构造一个正方体,先快速旋转3圈,同时颜色由蓝变绿;
再慢速旋转半圈,同时颜色又绿变紫。
class RotateColorSample01(ThreeDScene):
def construct(self):
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
cube = Cube().set_fill(BLUE, opacity=0.8)
self.play(
RotateAndColor(
cube,
angle=3 * TAU, # 旋转3圈
start_color=BLUE,
end_color=GREEN,
run_time=2,
)
)
self.wait()
# 添加对比动画
self.play(
RotateAndColor(
cube,
angle=TAU / 2, # 仅转半圈
start_color=GREEN,
end_color=PURPLE,
run_time=2,
)
)
self.wait()
2.2. 模拟公转自转
下面再构造一个略微复杂点的示例,构造两个球形模拟太阳和地球,太阳自转同时变色;
地球绕着太阳公转,且在绕的过程中逐渐变色(可用来模拟白天黑夜)。
class RotateColorSample02(ThreeDScene):
def construct(self):
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
sun = Sphere(color=YELLOW).scale(1.2)
earth = Sphere(resolution=24).scale(0.4).shift(RIGHT * 3)
# 地球公转+太阳自转+色温变化
self.play(
RotateAndColor(
sun,
angle=TAU / 2,
start_color=YELLOW,
end_color=RED,
rate_func=there_and_back,
),
RotateAndColor(
earth,
angle=TAU,
start_color=BLUE,
end_color=GREEN,
about_point=sun.get_center(),
rate_func=linear,
),
run_time=8,
)
self.wait()
3. 总结
通过上面介绍的方法,相信您已经掌握了制作专业级数学动画的核心技巧。
感兴趣的话,尝试修改示例代码中的参数,或者将旋转变色效果与缩放、位移等动画组合使用,创造出属于您的独特视觉效果!
原创作者: wang_yb 转载于: https://www.cnblogs.com/wang_yb/p/18903581