Manim实现图像变形特效
在数学教学和科普领域,变形效果往往能起到事半功倍的作用,让抽象的数学概念变得生动形象。
这篇文章将通过三个典型场景,来看看如何超越默认效果的限制,制作出更专业的变形动画。
1. 几何体的形态跃迁
传统形状变化往往生硬,而通过组合Transform与样式动画,我们可以创造更丰富的视觉效果:
class ShapeTransformation(Scene):
def construct(self):
# 创建带描边的起始图形
circle = Circle(radius=1, color=BLUE, stroke_width=8)
circle.set_fill(BLUE_E, opacity=0.5)
circle.shift(LEFT * 2)
# 准备目标图形并设置不同位置
square = Square(side_length=2, color=RED)
square.shift(RIGHT * 2 + UP)
# 同步执行形态变换和颜色渐变
self.play(
Transform(circle.copy(), square, path_arc=90 * DEGREES),
circle.animate.set_color(YELLOW).shift(RIGHT * 4 + DOWN),
run_time=3,
)
self.wait()
代码中,我们使用path_arc参数让变形路径呈现优美的弧线运动;
并且颜色与位置变化与形态变形同步进行;
一个图形(圆形)同时转换成两个图形(一个圆形,一个正方形)。

2. 坐标系的魔法转换
数学场景转换需要兼顾坐标系和图形,ReplacementTransform可以完美处理这种复合变换。
class CoordinateTransform(Scene):
def construct(self):
# 创建笛卡尔坐标系
cartesian = Axes(x_range=[-3,3], y_range=[-2,2])
graph1 = cartesian.plot(lambda x: np.sin(x), color=GREEN)
# 准备极坐标系
polar = PolarPlane(radius_max=2).scale(0.8)
graph2 = polar.plot(lambda t: 1+np.cos(3*t), color=YELLOW)
# 组合变换:坐标系与函数曲线同时替换
self.play(
ReplacementTransform(cartesian, polar),
ReplacementTransform(graph1, graph2),
run_time=2
)
# 增强效果:坐标轴颜色渐变
self.play(polar.animate.set_color(BLUE_C), run_time=1.5)
self.wait()
代码中核心功能在于:
- 同时替换坐标系和函数曲线保持场景一致性
- 使用scale调整坐标系比例确保平滑过渡
- 后期添加颜色动画强化视觉效果

3. 参数驱动的动态变化
下面通过UpdateFromAlphaFunc实现参数连续变化效果,函数图像变化的过程中同步更新参数值显示。
并且在函数图像变化的过程中,通过颜色插值interpolate_color函数,使得颜色随参数变化渐变(从绿色变成黄色)。
class ParameterTransformation(Scene):
def construct(self):
axes = Axes(
x_range=[-3 * PI, 3 * PI, PI],
y_range=[-3, 3, 1],
axis_config={"color": WHITE},
)
# 参数连续变化(动态展示a从1到2)
param_label = MathTex(r"y = a\sin(x)").to_edge(UP).shift(LEFT)
self.add(param_label, axes)
a_label = MathTex("a=")
a_value = DecimalNumber(1, num_decimal_places=1).next_to(a_label, RIGHT)
vg = VGroup(a_label, a_value).next_to(param_label, DOWN)
self.add(param_label, axes, vg)
# 创建可变的函数曲线
def update_func(mob, alpha):
a = interpolate(1, 2, alpha)
new_func = axes.plot(
lambda x: a * np.sin(x), color=interpolate_color(GREEN, YELLOW, alpha)
)
mob.become(new_func)
a_value.set_value(a)
dynamic_func = axes.plot(lambda x: 1 * np.sin(x), color=GREEN)
self.add(dynamic_func, a_value)
self.play(
UpdateFromAlphaFunc(dynamic_func, update_func, rate_func=linear, run_time=3)
)
self.wait()
显示效果如下:

4. 总结
使用Manim的Transform和ReplacementTransform实现数学图形动态变形。
比如,圆变方、正弦函数振幅连续变化等等,结合颜色插值与参数数值同步更新,直观演示参数对图形的影响。
Manim实现图像变形特效的更多相关文章
- 卡通图像变形算法(Moving Least Squares)附源码
本文介绍一种利用移动最小二乘法来实现图像变形的方法,该方法由用户指定图像中的控制点,并通过拖拽控制点来驱动图像变形.假设p为原图像中控制点的位置,q为拖拽后控制点的位置,我们利用移动最小二乘法来为原图 ...
- Windows Store App 变形特效
在应用程序的开发过程中,为了让界面按照期望的效果显示,有时会对界面元素应用变形特效,例如图片的缩放.旋转.移动等.与3D特效不同,在界面元素实现变形特效之后,其平行关系不会发生改变,只不过是位置.大小 ...
- canvas图像模糊以及图像变形问题
问题:有时用canvas作图时发现图像会出现模糊不清晰的问题,甚至做出来的图呈现出的效果与我们给的数值所应该呈现出的效果不一致 原因:当你在支持html5 canvas的浏览器下查看页面的时候,can ...
- Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效
原文:Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效 /// <summary> /// Image merge process. /// </summar ...
- Unity3D图像后处理特效——Depth of Field 3.4
Depth of Field 3.4 is a common postprocessing effect that simulates the properties of a camera lens. ...
- opencv滤镜-使用opencv实现各种图像滤镜特效
图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...
- html5之canvas困惑 在canvas标签内需要设置了宽跟高,如果在css中设置同样的宽跟高,画出来的图像变形了?
<canvas class="cvs"></canvas> 遇到的问题: 如css 中设.cvs{width:500px;height:400px;},也就 ...
- DragSelectRecyclerView 长按滑动多选图像android特效
高仿Google相册多选效果,长按某一item后然后滑动选择到任意item,效果很不错,适合相册页面多选部分效果. 本例子主要是自定义DragSelectRecyclerView通过如下展示gridv ...
- 基于CSS3 3D百叶窗图像过渡特效
你可能已经在网上看到过不少使用jQuery制作的百叶窗效果,我们可不可以使用纯CSS来完成这项工作呢?答案是肯定的.我们不仅可以制作出这种百叶窗效果,还可以使它具有响应性. 在线预览 源码下载 要 ...
- 使用Python基于OpenCV的图像油画特效
算法步骤: 1.获取图像的灰度图片 2.设计一个小方框(4x4/8x8 /10x10等),统计每个小方框的像素值 3.将0-255的灰度值划分成几个等级,并把第二步处理的结果映射到所设置的各个等级中, ...
随机推荐
- springboot 2.1.6.RELEASE整合Swagger2
一.引入依赖 1 <modelVersion>4.0.0</modelVersion> 2 <groupId>com.badcat</groupId> ...
- C# 私钥加密,公钥解密
/// <summary> /// RSA加密的密匙结构 公钥和私匙 /// </summary> public struct RSAKey { public string P ...
- 【Matlab】基于KDtree的最近邻搜索和范围搜索
摘要:介绍Matlab的rangesearch()函数和knnsearch()函数. rangesearch() -- 根据给定k-维数据集,返回指定距离范围内的所有数据点 knnsearch() - ...
- react使用插件配置px转换为rem
react使用插件postcss-pxtorem配置px自动转换rem 1.下载postcss-pxtorem插件 npm install postcss postcss-pxtorem --save ...
- 测试驱动开发(TDD)浅析
.wj_nav { display: inline-block; width: 100%; margin-bottom: 0.375rem } .wj_nav span { display: inli ...
- gazebo小车模型(附带仿真环境)
博客地址:https://www.cnblogs.com/zylyehuo/ 参考链接 1.(https://blog.csdn.net/qq_43406338/article/details/109 ...
- Linux环境 Oracle 监听和服务 日常操作
文章目录 一.Oracle监听 1.1. 查看Oracle监听运行状态 1.2. 启动 ...
- .NET 生成PDF文件
1.网上检索N种解决方案 QuestPDF:简单方便实用,文档也相对来说全,但是开源协议,当企业规模大的100W美金需要收费,未来存在潜在版权问题. itext7:感觉实用偏复杂,项目类库引用复杂,不 ...
- 支持VS2022的包发布工具NuPack 2022发布
我们很高兴地宣布 NuPack 2022 正式发布!这是一个开源项目,旨在简化 .NET 开发中的 NuGet 包发布流程. NuPack 是什么? NuPack 是一个轻量级工具,VS扩展,它可以帮 ...
- zk源码—4.会话的实现原理
大纲 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建 (3)会话ID的初始化实现 (4)设置的会话超时时间没生效的原因 2.分桶策略和会话管理 (1)分桶策略和过期队列 (2)会话激活 ...