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

3D旋转动态爱心 - Python创意代码

3D旋转动态爱心 - Python创意代码

3D旋转动态爱心代码,使用Python的Matplotlib库实现。这个程序创建了一个具有复杂数学曲面和动态旋转效果的3D爱心,并添加了粒子轨迹、光效等视觉元素。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure  # 补充缺失的模块导入
import math
import time# 设置图形和3D坐标轴
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题
fig = plt.figure(figsize=(12, 10), facecolor='black')
ax = fig.add_subplot(111, projection='3d')
ax.set_facecolor('black')
ax.grid(False)  # 关闭网格
ax.set_axis_off()  # 关闭坐标轴# 设置视角
ax.view_init(elev=30, azim=45)# 爱心参数方程
def heart_3d(x, y, z):"""计算3D爱心方程的值"""return (x**2 + (9/4)*y**2 + z**2 - 1)**3 - x**2*z**3 - (9/80)*y**2*z**3# 创建数据网格
n = 100  # 网格分辨率
x = np.linspace(-1.8, 1.8, n)
y = np.linspace(-1.8, 1.8, n)
z = np.linspace(-1.8, 1.8, n)
X, Y, Z = np.meshgrid(x, y, z)# 计算爱心曲面
F = heart_3d(X, Y, Z)# 提取爱心表面(修正模块调用)
verts, faces, _, _ = measure.marching_cubes(F, 0, spacing=(0.1, 0.1, 0.1))# 调整顶点位置到正确范围
verts = verts - [n/2, n/2, n/2]
verts = verts / (n/3.6)# 创建爱心表面
heart = ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='magma', alpha=0.9, edgecolor='none')# 添加粒子系统
num_particles = 200
particles = np.zeros((num_particles, 3))
particle_colors = np.random.rand(num_particles, 3)  # 随机颜色
particle_sizes = np.random.uniform(5, 50, num_particles)  # 随机大小# 初始化粒子位置在爱心内部
for i in range(num_particles):while True:pt = np.random.uniform(-1.2, 1.2, 3)if heart_3d(pt[0], pt[1], pt[2]) < 0:particles[i] = ptbreak# 绘制初始粒子
scatter = ax.scatter(particles[:, 0], particles[:, 1], particles[:, 2], s=particle_sizes, c=particle_colors, alpha=0.7)# 添加文字
title = ax.text2D(0.5, 0.95, "3D旋转动态爱心", transform=ax.transAxes,ha='center', color='#FF69B4', fontsize=24, fontweight='bold')
subtitle = ax.text2D(0.5, 0.90, "数学之美 · 编程之艺", transform=ax.transAxes,ha='center', color='white', fontsize=16)# 添加底部签名
signature = ax.text2D(0.5, 0.05, "Created with Python & Matplotlib", transform=ax.transAxes, ha='center', color='#FFD700', fontsize=14, fontstyle='italic')# 添加心形光效
def add_glow():for _ in range(20):r = np.random.uniform(1.5, 2.5)theta = np.random.uniform(0, 2*np.pi)phi = np.random.uniform(0, np.pi)x = r * np.sin(phi) * np.cos(theta)y = r * np.sin(phi) * np.sin(theta) * 0.8  # 压缩y轴z = r * np.cos(phi) * 0.5  # 压缩z轴size = np.random.uniform(30, 100)alpha = np.random.uniform(0.1, 0.3)color = np.random.choice(['#FF1493', '#FF69B4', '#FFB6C1', '#FFC0CB'])ax.scatter([x], [y], [z], s=size, c=color, alpha=alpha, edgecolors='none')add_glow()# 添加坐标轴装饰
ax.plot([-2, 2], [0, 0], [0, 0], color='#00FFFF', alpha=0.3, linewidth=1)
ax.plot([0, 0], [-2, 2], [0, 0], color='#00FFFF', alpha=0.3, linewidth=1)
ax.plot([0, 0], [0, 0], [-2, 2], color='#00FFFF', alpha=0.3, linewidth=1)# 添加边框装饰
for s in np.linspace(-2, 2, 8):ax.plot([s, s], [-2, -2], [-2, 2], color='#9400D3', alpha=0.2, linewidth=0.5)ax.plot([s, s], [2, 2], [-2, 2], color='#9400D3', alpha=0.2, linewidth=0.5)ax.plot([-2, 2], [s, s], [-2, -2], color='#9400D3', alpha=0.2, linewidth=0.5)ax.plot([-2, 2], [s, s], [2, 2], color='#9400D3', alpha=0.2, linewidth=0.5)# 动画更新函数(新增时间戳更新)
def update(frame):# 旋转爱心angle = frame * 0.5ax.view_init(elev=30, azim=angle)# 更新粒子位置particles += np.random.uniform(-0.05, 0.05, (num_particles, 3))# 向量化检查粒子是否在爱心内(优化性能)mask = heart_3d(particles[:,0], particles[:,1], particles[:,2]) > 0particles[mask] -= np.random.uniform(-0.03, 0.03, (mask.sum(), 3))# 更新散点图数据scatter._offsets3d = (particles[:, 0], particles[:, 1], particles[:, 2])# 动态改变粒子大小new_sizes = particle_sizes * (0.8 + 0.4 * np.sin(frame * 0.1))scatter.set_sizes(new_sizes)# 动态改变爱心颜色heart.set_array(np.sin(verts[:, 0] + frame * 0.1))# 更新标题颜色title.set_color(plt.cm.magma(0.5 + 0.3 * np.sin(frame * 0.05)))# 每100帧添加新光效if frame % 100 == 0:add_glow()# 更新时间戳(新增)timestamp.set_text(time.strftime('%Y-%m-%d %H:%M:%S'))return scatter, heart, title, timestamp# 创建动画(新增时间戳对象)
timestamp = ax.text2D(0.01, 0.01, time.strftime('%Y-%m-%d %H:%M:%S'), transform=ax.transAxes, color='#7CFC00', fontsize=10)ani = FuncAnimation(fig, update, frames=range(0, 360, 2), interval=40, blit=False)plt.tight_layout()
plt.show()

代码解读

这个3D旋转爱心程序结合了数学建模、计算机图形学和动画技术,以下是关键部分的详细解读:

1. 3D爱心数学模型

核心是使用隐式方程定义爱心曲面:

def heart_3d(x, y, z):return (x**2 + (9/4)*y**2 + z**2 - 1)**3 - x**2*z**3 - (9/80)*y**2*z**3

这个方程描述了一个3D爱心曲面,通过marching_cubes算法提取等值面生成网格。

2. 动态粒子系统

程序包含一个粒子系统,粒子在爱心内部随机运动:

# 初始化200个粒子
num_particles = 200
particles = np.zeros((num_particles, 3))# 更新粒子位置
for i in range(num_particles):particles[i] += np.random.uniform(-0.05, 0.05, 3)# 确保粒子在爱心内部while heart_3d(particles[i, 0], particles[i, 1], particles[i, 2]) > 0:particles[i] -= np.random.uniform(-0.03, 0.03, 3)

3. 视觉特效

  • 光效系统:在爱心周围随机生成半透明的彩色光点
  • 动态着色:爱心表面使用magma颜色映射并随时间变化
  • 粒子脉动:粒子大小随正弦函数变化,产生呼吸效果
  • 坐标装饰:添加了半透明的坐标轴和边框

4. 动画系统

使用FuncAnimation实现平滑动画:

def update(frame):# 旋转视角angle = frame * 0.5ax.view_init(elev=30, azim=angle)# 更新粒子位置和大小# ...# 更新爱心颜色heart.set_array(np.sin(verts[:, 0] + frame * 0.1))

5. 界面设计

  • 黑色背景增强视觉效果
  • 动态变化的标题和副标题
  • 底部签名和时间戳
  • 关闭坐标轴和网格,聚焦爱心主体

技术亮点

  1. 复杂3D建模:使用数学方程定义复杂曲面
  2. 实时物理模拟:粒子在约束空间内的随机运动
  3. 高级渲染技术:透明效果、动态光照、表面着色
  4. 高效动画:优化更新机制确保流畅性
  5. 美学设计:精心选择的配色方案和视觉元素

运行说明

运行此代码需要安装以下Python库:

pip install numpy matplotlib scikit-image

程序会生成一个动态旋转的3D爱心,包含内部流动的粒子特效和周围的光晕效果。动画将持续运行,展示爱心的全方位视角。

这个创意项目展示了Python在科学计算可视化方面的强大能力,将数学之美通过编程转化为视觉艺术。

http://www.xdnf.cn/news/871165.html

相关文章:

  • MySQL ACID 面试深度解析:原理、实现与面试实战
  • Pytest+Selenium UI自动化测试实战实例
  • MCP:AI应用的通用接口,如何重塑大模型与外部系统的连接?
  • 小米又开源了,一个多模态大模型 + 一个生不逢时的推理大模型
  • CppCon 2015 学习:Bridging Languages Cross-Platform
  • 循环链表与循环队列的区分与对比
  • 防火墙iptables项目实战
  • Java 二维码
  • ROS2性能狂飙:C++11移动语义‘偷梁换柱’实战
  • CSP严格模式返回不存在的爬虫相关文件
  • C#和C++在编译过程中的文件区分
  • 树莓派上遇到插入耳机后显示“无输入设备”问题
  • 格恩朗椭圆齿轮流量计 精准计量 赋能工业
  • 探索花语的奥秘:全新花语网站上线啦!
  • Elasticsearch中的地理空间(Geo)数据类型介绍
  • PostgreSQL配置文件修改及启用方法
  • ubutu修改网关
  • 将多个分段btsnoop文件合并为一个
  • 低空城市场景下的多无人机任务规划与动态协调!CoordField:无人机任务分配的智能协调场
  • HTML转EXE最新版本2.1.0新功能介绍 - 附CSDN免费下载链接
  • 数据结构与算法:动态规划中根据数据量猜解法
  • 在java 项目 springboot3.3 中 调用第三方接口(乙方),如何做到幂等操作(调用方为甲方,被调用方为乙方)? 以及啥是幂等操作?
  • 【ArcGIS微课1000例】0148:Geographic Imager6.2使用教程
  • Sentry 项目简介
  • 【Zephyr 系列 8】构建完整 BLE 产品架构:状态机 + AT 命令 + 双通道通信实战
  • dxf、dwg中文字矩阵变换
  • Django核心知识点全景解析
  • 网络攻防技术十三:网络防火墙
  • 企业私有化部署DeepSeek实战指南:从硬件选型到安全运维——基于国产大模型的安全可控落地实践
  • Redis命令使用