当前位置: 首页 > backend >正文

炫酷粒子系统动画实战:Matplotlib实现银河漩涡效果

炫酷粒子系统动画实战:Matplotlib实现银河漩涡效果

  • 效果演示:银河粒子漩涡
  • 核心代码分析
    • 1. 粒子系统初始化
    • 2. 动画更新函数
    • 3. 渲染优化技巧
  • 完整实现代码
  • Matplotlib的动画模块介绍
    • ​核心类对比
    • 核心功能分点
    • 注意事项

效果演示:银河粒子漩涡

动态特征​:

  1. 500个粒子组成旋转星云,呈现螺旋轨迹运动​
  2. 粒子颜色随速度渐变(蓝->紫->红)
  3. 粒子尺寸根据离心力动态变化
  4. 背景呈现深空渐变效果

在这里插入图片描述
在这里插入图片描述

核心代码分析

1. 粒子系统初始化

class ParticleSystem:def __init__(self, n=500):# 极坐标参数初始化self.theta = np.linspace(0, 8*np.pi, n)self.r = np.linspace(0, 1, n)**0.5  # 半径非线性分布# 动态参数self.dr = np.random.uniform(0.95, 1.05, n)  # 半径变化因子self.speed = np.random.uniform(0.8, 1.2, n) # 角速度差异self.size = 10 * np.sin(self.theta)**2 + 1  # 初始尺寸# 转换为笛卡尔坐标self.x = self.r * np.cos(self.theta)self.y = self.r * np.sin(self.theta)

关键技术点​:

  • 使用极坐标构建初始分布,r**0.5实现中心密集效果
  • speed参数控制粒子角速度差异,产生层次感
  • sin(theta)^2尺寸计算创建波浪形大小分布

2. 动画更新函数

def update(frame):# 半径动态变化(模拟离心力)ps.r *= ps.dr  ps.r = np.clip(ps.r, 0, 2)  # 限制最大半径# 角度持续增加(形成旋转)ps.theta += 0.02 * ps.speed# 坐标更新ps.x = ps.r * np.cos(ps.theta)ps.y = ps.r * np.sin(ps.theta)# 颜色和尺寸更新colors = plt.cm.plasma((ps.r/2 + frame/100) % 1)  # 动态色相sizes = 50 * np.abs(np.sin(0.5*ps.theta + frame/20)) + 1# 更新散点图属性scatter.set_offsets(np.c_[ps.x, ps.y])scatter.set_color(colors)scatter.set_sizes(sizes)return scatter,

核心算法​:

  • clip函数限制粒子扩散范围
  • plasma颜色映射结合帧数实现动态渐变
  • set_offsets高效更新所有粒子位置(比逐点更新快10倍+)

3. 渲染优化技巧

# 使用TkAgg后端提升性能
import matplotlib
matplotlib.use('TkAgg')  # 创建深空渐变背景
gradient = np.linspace(0, 1, 256).reshape(1, -1)
ax.imshow(gradient, aspect='auto', cmap='plasma', extent=[-2.5, 2.5, -2.5, 2.5], alpha=0.15)# 开启blitting加速
ani = animation.FuncAnimation(fig, update, interval=20, blit=True, cache_frame_data=False)

性能优化​:

  • TkAgg后端支持硬件加速
  • imshow创建静态渐变背景,减少重复渲染
  • cache_frame_data=False避免内存泄漏

完整实现代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.colors import Normalizeclass ParticleSystem:def __init__(self, n=500):self.theta = np.linspace(0, 8*np.pi, n)self.r = np.linspace(0, 1, n)**0.5self.dr = np.random.uniform(0.95, 1.05, n)self.speed = np.random.uniform(0.8, 1.2, n)self.size = 10 * np.sin(self.theta)**2 + 1self.x = self.r * np.cos(self.theta)self.y = self.r * np.sin(self.theta)# 初始化画布
fig, ax = plt.subplots(figsize=(8,8), facecolor='black')
ax.axis('off')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)# 创建渐变背景
gradient = np.linspace(0, 1, 256).reshape(1, -1)
ax.imshow(gradient, aspect='auto', cmap='plasma', extent=[-2.5, 2.5, -2.5, 2.5], alpha=0.15)# 初始化粒子系统
ps = ParticleSystem()
scatter = ax.scatter(ps.x, ps.y, c=ps.r, cmap='plasma', s=ps.size, alpha=0.7, edgecolors='none')def update(frame):ps.r = np.clip(ps.r * ps.dr, 0, 2)ps.theta += 0.02 * ps.speedps.x = ps.r * np.cos(ps.theta)ps.y = ps.r * np.sin(ps.theta)colors = plt.cm.plasma((ps.r/2 + frame/100) % 1)sizes = 50 * np.abs(np.sin(0.5*ps.theta + frame/20)) + 1scatter.set_offsets(np.c_[ps.x, ps.y])scatter.set_color(colors)scatter.set_sizes(sizes)return scatter,# 运行动画
ani = animation.FuncAnimation(fig, update, frames=200, interval=20, blit=True, cache_frame_data=False)# 保存动画(可选)
# ani.save('galaxy.mp4', writer='ffmpeg', dpi=120, extra_args=['-vcodec', 'libx264'])plt.show()

Matplotlib的动画模块介绍

模块名​:matplotlib.animation
​作用​:生成动态可视化,支持保存为GIF、视频或实时交互显示。

​核心类对比

类名适用场景核心机制优点缺点
FuncAnimation动态生成帧(逐帧更新)通过函数回调更新图形元素内存高效,适合复杂动画需要手动编写更新逻辑
ArtistAnimation预渲染所有帧后播放直接绘制预先生成的艺术家对象简单易用,适合静态帧序列内存占用高,不适合大数据

核心功能分点

FuncAnimation 主要参数

  • fig: 画布对象

  • func: 更新图形的回调函数(每帧调用)

  • frames: 帧数据(可迭代对象或生成器)

  • init_func: 初始化函数(可选)

  • interval: 帧间隔时间(毫秒,默认200)

  • blit: 是否启用优化渲染(仅重绘变化部分)

ArtistAnimation 主要参数

  • fig: 画布对象

  • artists: 包含每帧艺术家对象(如线条、图像)的列表

注意事项

​依赖项​:

  • 保存视频需安装外部库(如ffmpeg或imagemagick)
  • 在Jupyter中显示动画需添加%matplotlib notebook或使用HTML(anim.to_html5_video())

​性能优化​:

  • 启用blit=True可显著提升渲染速度
  • 避免在回调函数中重复创建对象
http://www.xdnf.cn/news/5349.html

相关文章:

  • SierraNet M1288网络损伤功能显著助力GPU互联网络的测试验证,包含包喷洒,LLR等复杂特性的验证测试
  • GMS 与非 GMS:有何区别?
  • Java基础:代理
  • KNOWLEDGE-BASED SYSTEMS(KBS期刊)投稿经验分享
  • # 深度学习实操 附录B 深入解析 tensorflow 自动微分
  • 纯惯性导航、非线性最小二乘法纯uwb测距导航定位、惯性uwb松组合导航、惯性uwb紧组合导航,四种方法对比
  • 圆角边框 盒子阴影 文字阴影
  • Linux进程间通信(四)之补充【日志】
  • PCB设计实践(十三)PCB设计中差分线间距与线宽设置的深度解析
  • 蓝牙GAP协议概述
  • AI赋能研究工作:我的深度学习助手使用体验(DeepResearch)
  • 认识 Linux 内存构成:Linux 内存调优之内存分配机制和换页行为认知
  • ERP学习(二):用友软件产品之系统管理
  • 学习黑客5 分钟深入浅出理解SCP
  • 【从零实现JsonRpc框架#3】线程模型与性能优化
  • 《设计数据密集型应用》——阅读小记
  • JAVA——抽象类和接口的区别
  • 【Linux基础】系统监控和进程管理指令
  • 【Reality Capture 】Reality Capture1.5中文版安装教程(附安装包下载)
  • 英语六级---2024.12卷三 仔细阅读2
  • VRRP协议-IP地址冗余配置
  • Autoware播放提示音
  • ospf实验报告
  • Markdown—LaTeX 数学公式
  • 深入解析路由策略:从流量控制到策略实施
  • DAX 权威指南1:DAX计算、表函数与计算上下文
  • 《从零构建大模型》PDF下载(中文版、英文版)
  • python-django项目启动寻找静态页面html顺序
  • 洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术
  • PDF转Excel工具推荐 小巧免费批量自动转换