Manim实现闪光轨迹特效

news/2025/9/18 19:26:33/文章来源:https://www.cnblogs.com/wang_yb/p/19099538

在动画制作中,轨迹特效常常用于增强视觉效果,而带有闪光效果的轨迹更是能够吸引观众的注意力。

本文将介绍如何使用Manim动画库实现闪光轨迹特效。

1. 实现原理

下面的GlowingTracedPath类参考了Manim中的TracePath类,增加了闪光和渐变色的效果。

class GlowingTracedPath(VMobject):def __init__(self,traced_point_func: Callable,stroke_width: float = 2,stroke_color: ParsableManimColor | None = WHITE,dissipating_time: float | None = None,gradient_colors: list[ParsableManimColor] | None = None,  #glow_speed: int = 2,**kwargs,):"""构造函数Parameters:traced_point_func - 回调函数,用于获取被追踪点的当前位置stroke_width - 轨迹的宽度,默认为 2stroke_color - 轨迹的基本颜色,默认为白色dissipating_time - 轨迹的消散时间gradient_colors - 颜色渐变列表glow_speed - 闪光速度,控制轨迹闪光效果的快慢**kwargs - 用于传递额外的关键字参数到父类VMobject的构造函数中"""super().__init__(stroke_color=stroke_color,stroke_width=stroke_width,**kwargs,)self.glow_speed = glow_speedif not gradient_colors is None:self.set_color_by_gradient(gradient_colors)self.set_stroke(opacity=0.2)self.traced_point_func = traced_point_funcself.dissipating_time = dissipating_timeself.time = 1self.add_updater(self.update_path)def update_path(self, mob, dt):# 更新轨迹中的点new_point = self.traced_point_func()if not self.has_points():self.start_new_path(new_point)self.time += dtt = self.time * self.glow_speed  # 控制脉冲速度intensity = 0.25 * np.sin(t) + 0.75  # 0.5-1之间波动# 动态调整透明度self.set_stroke(opacity=intensity,  # 透明度波动)self.add_line_to(new_point)# 轨迹消散if self.dissipating_time:if self.time - 1 > self.dissipating_time:nppcc = self.n_points_per_curveself.set_points(self.points[nppcc:])

初始化函数(__init__)的参数,代码中已经有详细的注释,不再赘述。

至于更新轨迹的update_path方法,它的关键逻辑有:

  • 获取新点:通过traced_point_func获取被追踪点的当前位置,并将其添加到轨迹的末尾
  • 动态调整透明度:使用正弦函数np.sin生成一个在0.51之间波动的强度值intensity,并通过set_stroke方法动态调整轨迹的透明度,从而实现闪烁效果
  • 轨迹消散:如果设置了dissipating_time参数,当轨迹的持续时间超过该值时,会移除轨迹的起始部分,使轨迹逐渐消失

此外,GlowingTracedPath类还会通过set_color_by_gradient方法为轨迹设置颜色渐变效果。

2. 使用示例

接下来我们通过几个示例来看看如何使用这个特效。

2.1. 渐变色轨迹

基于上面我们实现的GlowingTracedPath类,实现一个渐变色的轨迹非常简单。

a = Dot(RIGHT * 2)
b = GlowingTracedPath(a.get_center,gradient_colors=[BLUE, RED, YELLOW],
)
self.add(a, b)
self.play(a.animate(path_arc=PI / 2).shift(LEFT * 2), run_time=2)
self.play(a.animate(path_arc=-PI / 2).shift(LEFT * 2), run_time=2)

代码中,轨迹b追踪点a的位置,形成一个由参数gradient_colors指定的渐变色轨迹。

2.2. 轨迹逐渐消失

上面的示例中,轨迹不会消失,通过参数dissipating_time,可以指定轨迹存在的时间(单位:秒)。

b = GlowingTracedPath(a.get_center,gradient_colors=[BLUE, RED, YELLOW],dissipating_time=0.5,
)

轨迹bdissipating_time设置为0.5,也就是新产生的轨迹会在0.5秒后逐渐消失。

2.3. 轨迹闪烁

最后,来看看轨迹的闪光效果,下面的通过设置两种不同的glow_speed(闪烁的速度),

来比较不同速度下的闪烁效果。

a1 = Dot()
a2 = Dot()
b1 = GlowingTracedPath(a1.get_center,gradient_colors=[BLUE, RED, YELLOW],glow_speed=8,
)
b2 = GlowingTracedPath(a2.get_center,gradient_colors=[BLUE, RED, YELLOW],glow_speed=16,
)
self.add(a1, b1, a2, b2)heart1 = ImplicitFunction(lambda x, y: (x**2 + y**2 - 1) ** 3 - x**2 * y**3,color=PINK,x_range=[-1.5, 1.5],y_range=[-1.2, 1.8],
).shift(LEFT * 1.5)
heart2 = ImplicitFunction(lambda x, y: (x**2 + y**2 - 1) ** 3 - x**2 * y**3,color=PINK,x_range=[-1.5, 1.5],y_range=[-1.2, 1.8],
).shift(RIGHT * 1.5)self.play(MoveAlongPath(a1, heart1), MoveAlongPath(a2, heart2), run_time=4)

左边的心形glow_speed=8右边的心形glow_speed=16,所以右边的闪烁速度会快一些。

3. 总结

通过GlowingTracedPath类,我们可以轻松地在Manim中实现带有闪光效果的轨迹。

这个类通过动态调整透明度和颜色渐变,结合轨迹的实时更新,创造出了引人注目的视觉效果。

无论是用于数学动画还是其他创意项目,这种特效都能为你的作品增添独特的魅力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Slope Trick 学习笔记

前言 诚然,虽然它名字里带了"Slope",但是它不是斜率优化,而是一个比它还要难的东西(作者本人主观臆断)。 并且,关于 CF13C,有一点很多文章都没有提及,所以会有人看不懂为什么要这么做(作者本人亲身…

使用 libaudioclient 实现 Android Native层 音频测试工具

libaudioclient 除了支持 setAudioPortConfig() 调用,也支持 setMasterMute()、setStreamMute()、setParameters()、getParameters()、setMode() 等接口调用,满足各种开发测试需求。它让你不需要关注这些细枝末节的差…

03-初始化测试数据

03-初始化测试数据$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");显示所有数据库 show databases;创建数据库 create database testdb;使用数据库 use test…

漏洞详解--文件上传 如何花样绕过?!

一、漏洞原理 1.1 核心 文件上传漏洞,顾名思义,将攻击者将恶意文件上传到服务器,服务器将恶意文件解析,攻击就达成了。 1.2 漏洞详解 文件上传漏洞非常好理解,有三个关键点,一是上传文件,二是找到文件上传的路径…

深入解析:AI Agent开发秘籍:Prompt工程与测评最佳实践(建议收藏反复研读)

深入解析:AI Agent开发秘籍:Prompt工程与测评最佳实践(建议收藏反复研读)2025-09-18 19:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-…

使用Windows客户端访问EDA环境的NFS共享

在IC设计环境中, 也总是会有Windows操作系统的开发服务器或者客户端需要使用IC设计平台中Linux主机使用的NFS服务器。 使用者也是IC设计团队中的一员,可能出于设计工具的原因, 他/她的部分工作必须在Windows中完成,…

Day03-1

public class HelloWorld { public static void main(String[] args) { String teacher = "David"; System.out.println("Hello World"); } //有趣的代码注释 //单行注释 //输出一个Hello,World! …

实用指南:鸿蒙智能设备自动诊断实战:从传感器采集到远程上报的完整实现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

使用php -S 127.0.0.1:8000 新建php服务

php -S 127.0.0.1:8000 启动服务后 当前坐在目录下的所有文件都可以在浏览器上以 http://127.0.0.1/目录/文件名称 的形式访问 比如: 浏览器访问 http://127.0.0.1/upload_files.php 就会直接调用当前目录 upload_fi…

WPF ControlTemplate DI Via Microsoft.Extensions.DependencyInjection

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; //app.xaml <Application x:Class="WpfApp21.App"xmlns="http://schemas.microsoft.com/winf…

完整教程:从“我店”模式看绿色积分电商平台的困境与破局

完整教程:从“我店”模式看绿色积分电商平台的困境与破局pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

Java第三周课前思考

什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?完成独立功能或创建类的实例或对类级别的属性进行操作的方法应该用static修饰。 不用static修饰的方法往…

完整教程:光伏电站安全 “守护神”:QB800 绝缘监测平台,为清洁能源高效运行筑固防线

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java的安装及卸载

卸载JDK删除java的安装目录 删除JAVA_HOME(环境配置中) 删除path下关于java的目录(环境配置中) cmd中查找java -version是否仍存在安装JDK百度搜索JDK8,找到下载地址 同意协议 下载电脑对应的版本 双击安装JDK 记…

sql server 折腾时不小心去掉了 sysadmin 权限

sql server 折腾时不小心去掉了 sysadmin 权限恢复方法: net stop MSSQLSERVERsqlcmd -E -S . -Q "ALTER SERVER ROLE sysadmin ADD MEMBER [MyPC\admin]"net start MSSQLSERVER桂棹兮兰桨,击空明兮溯流光…

题解:P13882 [蓝桥杯 2023 省 Java A] 小蓝的旅行计划

挺可爱的反悔贪心,乍一看没看出和旅行家的预算的区别,甚至做完才发现不一样的说。 正文 首先我们可以将操作分为两个部分。分别是用油操作和加油操作。 用油 有一个简单的贪心策略,用油的时候首先使用最便宜的油,这…

深入解析:无人设备遥控器之帧同步技术篇

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:订阅式红队专家服务:下一代网络安全评估新模式

实用指南:订阅式红队专家服务:下一代网络安全评估新模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

更快的布尔矩阵乘法

这是小蝴蝶研读的第二篇论文,时间复杂度的话,原论文写的是 \(\frac{n^3}{2^{\Omega(\sqrt[7]{\log n})}}\),我感觉这个界可以精确分析出来,不过我还没看懂论文,先占个坑。

RWA技术规范解读:如何实现现实世界资产的合规代币化

RWA技术规范解读:如何实现现实世界资产的合规代币化 近日,深圳市信息服务业区块链协会发布了《RWA技术规范》(T/SZBA-2025),这是国内首个针对现实世界资产代币化的团体标准。本文将深入解读该规范的核心内容,帮助读…