在数学动画的世界里,旋转与变色特效无疑是最能吸引观众眼球的元素之一。

今天,就让我们一起探索如何使用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. 总结

通过上面介绍的方法,相信您已经掌握了制作专业级数学动画的核心技巧。

感兴趣的话,尝试修改示例代码中的参数,或者将旋转变色效果与缩放、位移等动画组合使用,创造出属于您的独特视觉效果!

Manim实现旋转变色特效的更多相关文章

  1. Rotating Image Slider - 图片旋转切换特效

    非常炫的图片旋转滑动特效,相信会给你留下深刻印象.滑动图像时,我们会稍稍旋转它们并延缓各元素的滑动.滑块的不寻常的形状是由一些预先放置的元素和使用边框创建.另外支持自动播放选项,鼠标滚轮的功能. 在线 ...

  2. 鼠标HOVER时区块动画旋转变色的CSS3样式掩码

    鼠标hover时区块动画旋转变色的css3样式掩码<!DOCTYPE html> <html> <head> <meta charset="utf- ...

  3. 可控制转速CSS3旋转风车特效

    以前制作网页动画一般使用javascript,现在已经有越来越多动动画使用纯CSS实现,并且动画的控制也可以使用CSS3实现,因为CSS 3来了,CSS 3的动画功能确实强大.以下是一个纯CSS3制作 ...

  4. 基于jQuery环形图标菜单旋转切换特效

    分享一款基于jQuery环形图标旋转切换特效.这是一款鼠标点击图标菜单圆形顺时针或者逆时针旋转切换代码.效果图如下: 在线预览   源码下载 实现的代码. js代码: /* 图片地址可以是相对路径或绝 ...

  5. 基于jQuery和CSS3炫酷图片3D旋转幻灯片特效

    在线预览   源码下载 iPresenter是一款效果非常炫酷的jQuery和CSS3 3D旋转幻灯片特效插件.你可以使用它来制作产品展示.图片画廊或者各种幻灯片和轮播图特效.这款幻灯片插件的特点有: ...

  6. 2.纯 CSS 创作一个矩形旋转 loader 特效

    原文地址:2.纯 CSS 创作一个矩形旋转 loader 特效 扩展后地址:https://scrimba.com/c/cNJVWUR  扩展地址:https://codepen.io/pen/ HT ...

  7. 一款基于jQuery和CSS3炫酷3D旋转画廊特效插件

    这是一款效果炫酷的jQuery和CSS3 3D旋转画廊特效插件.该3D画廊插件可以通过前后导航按钮来切换图片,效果就像旋转木马一样.它还带有点击放大图片,显示图片标题和用键盘操作等功能. 在线预览   ...

  8. Atitit.随时间变色特效 ---包厢管理系统的规划

    Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...

  9. AAtitit.随时间变色特效 ---包厢管理系统的规划titit.随

    Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...

  10. 利用CSS3给图片添加旋转背景特效

    首先看旋转特效:http://***/demo/201512/2015-12-09-css3-image-hover-animate/index.html 这是一款纯CSS3实现的当鼠标滑过图片时文字 ...

随机推荐

  1. Trae AI 工具使用记录--0手写代码创建桌面代办事项软件

    使用的AI工具是最近字节跳动出品的Trae工具. 第一步 下载IDE,Trae(官网链接 https://www.trae.ai) 安装完成后注册.登录,可以直接使用github账号.第一个坑就是目前 ...

  2. rabbitmq的基本使用

    使用MQ的三大作用:1.同步变异步2.流量削峰3.解耦降低服务间的耦合性要不要使用MQ,需不需要使用MQ依据项目的需要做选择. 使用场景: 例如:注册用户时候,发送激活邮件.监控应用中抛出的异常,邮件 ...

  3. AI技术革命,工作效率10个最佳AI工具

    AI技术革命,工作效率10个最佳AI工具 目       录 1.      Vidwud AI PowerPoint生成器... 4 2.      Vidnoz AI音乐视频生成器... 5 3. ...

  4. selenium自动化测试-获取黄金实时价格

    最近黄金比较火爆,想要获取黄金实时价格,方便后续监控预警价格,一般实时刷新的网页数据都是动态加载的,需要用到selenium自动化测试获取动态页面数据. 昨天学会了获取动态网页小说内容,同理也可以获取 ...

  5. NumPy学习6

    今天学习 NumPy位运算 12, NumPy位运算NumPy 中提供了以下按位运算函数:numpy按位运算函数序号 函数 位运算符 描述说明1 bitwise_and & 计算数组元素之间的 ...

  6. 使用df命令

    1.使用df命令,查看整体的磁盘使用情况 df命令是用来查看硬盘的挂载点,以及对应的硬盘容量信息.包括硬盘的总大小,已经使用的大小,剩余大小.以及使用的空间占有的百分比等. 最常用的命令格式就是: 1 ...

  7. 【SpringCloud】Eureka服务注册与发现

    Eureka服务注册与发现 补充 Eureka基础知识 什么是服务治理 Spring Cloud封装了Netlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与 ...

  8. Sunshine+Moonlight让安卓Pad或IPad变6ms低延迟高质量无线显示器 #串流 #无线副屏

    1.背景 最近看到多个博主在分享局域网或者公网使用Sunshine+Moonlight串流技术,将电脑画面投屏到其他屏幕(电视.安卓和苹果平板等等),宣称是个位数的延迟,并且能用平板打steam游戏( ...

  9. SpringBoot 部署:外置依赖包

    目录: 1.前言 2.瘦身前的Jar包 3.解决方案 一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编 ...

  10. 使用Python解析求解扩散方程

    引言 大家好!今天我们来探讨一个非常重要的物理问题-扩散方程,并用 Python 来求解它.扩散现象广泛存在于自然界中,从气体.液体中分子的扩散,到热量的传递,甚至污染物的扩散,都是扩散方程的应用场景 ...