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

用Python和Pygame创造粉色粒子爱心:3D渲染的艺术

引言

在计算机图形学中,3D效果的2D渲染是一个迷人的领域。今天,我将分享一个使用Python和Pygame库创建的粉色粒子爱心效果。这个项目不仅视觉效果惊艳,而且代码简洁易懂,非常适合图形编程初学者学习3D渲染的基础概念。

项目概述

这个程序创建了一个由5000个粉色粒子组成的3D爱心,在黑色背景中优雅旋转。粒子会根据其深度改变大小和亮度,创造出真实的3D透视效果。

技术实现

1. 初始化设置

import pygame
import math
import random
from pygame.locals import *

# 初始化pygame
pygame.init()

# 设置窗口
WIDTH, HEIGHT = 550, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("粉色花生米")

# 颜色定义
BLACK = (0, 0, 0)
PINK = (255, 182, 193)  # 粉红色
LIGHT_PINK = (255, 209, 220)  # 浅粉色

2. 粒子类设计

粒子类是项目的核心,负责每个粒子的3D位置、颜色和渲染:

class Particle:
    def __init__(self):
        # 使用球坐标生成爱心形状的点
        theta = random.uniform(0, math.pi)
        phi = random.uniform(0, 2 * math.pi)
        
        # 爱心形状的球坐标转换
        r = self.heart_shape(theta, phi)
        
        # 转换为3D笛卡尔坐标
        self.x = r * math.sin(theta) * math.cos(phi)
        self.y = r * math.sin(theta) * math.sin(phi)
        self.z = r * math.cos(theta)
        
        # 添加随机扰动使粒子分布更自然
        self.x += random.uniform(-0.3, 0.3)
        self.y += random.uniform(-0.3, 0.3)
        self.z += random.uniform(-0.3, 0.3)
        
        # 粒子属性
        self.base_color = random.choice([PINK, LIGHT_PINK])
        self.base_size = random.uniform(0.5, 1.5)
        self.angle_x = 0
        self.angle_y = 0
        self.angle_z = 0

3. 爱心形状算法

爱心形状是通过球坐标转换实现的数学魔法:

def heart_shape(self, theta, phi):
    """将球坐标转换为爱心形状"""
    t = theta * 2  # 映射到0-2π
    heart_factor = (13*math.cos(t) - 5*math.cos(2*t) - 2*math.cos(3*t) - math.cos(4*t)) / 13
    
    # 转换为球体形状
    r = 10 * (0.8 + 0.2 * heart_factor)
    return r

这个公式基于心形线的极坐标方程,经过调整后适合在3D空间中使用。

4. 3D旋转与投影

粒子在3D空间中的旋转和2D投影是创造3D效果的关键:

def update(self):
    # 旋转角度增量
    self.angle_x += 0.002
    self.angle_y += 0.003
    self.angle_z += 0.001
    
    # 3D旋转 - 绕x、y、z轴旋转
    y_rot = self.y * math.cos(self.angle_x) - self.z * math.sin(self.angle_x)
    z_rot = self.y * math.sin(self.angle_x) + self.z * math.cos(self.angle_x)
    
    x_rot = self.x * math.cos(self.angle_y) + z_rot * math.sin(self.angle_y)
    z_rot = -self.x * math.sin(self.angle_y) + z_rot * math.cos(self.angle_y)
    
    x_final = x_rot * math.cos(self.angle_z) - y_rot * math.sin(self.angle_z)
    y_final = x_rot * math.sin(self.angle_z) + y_rot * math.cos(self.angle_z)
    
    # 透视投影
    scale = 15
    distance = 10
    
    # 计算2D坐标
    x_proj = WIDTH//2 + int(x_final * scale)
    y_proj = HEIGHT//2 - int(y_final * scale)
    
    # 根据深度调整大小和颜色
    depth_factor = (z_rot + distance) / (2 * distance)
    self.curr_size = max(1, int(self.base_size * depth_factor))
    
    color_factor = min(1.0, max(0.4, depth_factor * 1.3))
    r = min(255, max(0, int(self.base_color[0] * color_factor)))
    g = min(255, max(0, int(self.base_color[1] * color_factor)))
    b = min(255, max(0, int(self.base_color[2] * color_factor)))
    self.curr_color = (r, g, b)
    
    return x_proj, y_proj

5. 主循环与渲染

# 创建5000个粒子
particles = [Particle() for _ in range(5000)]

# 主循环
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
    
    # 清屏并添加淡出效果
    screen.fill(BLACK)
    fade_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
    fade_surface.fill((0, 0, 0, 15))  # 淡出拖尾效果
    screen.blit(fade_surface, (0, 0))
    
    # 绘制所有粒子
    for particle in particles:
        particle.draw(screen)
    
    # 添加文字
    font = pygame.font.SysFont('微软雅黑', 30)
    text = font.render("particles", True, (255, 255, 255))
    screen.blit(text, (WIDTH//2 - text.get_width()//2, 30))
    
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

效果特点

  1. 3D透视:粒子根据深度改变大小和亮度,远处的粒子更小更暗

  2. 平滑动画:三轴不同速度的旋转创造出复杂的运动轨迹

  3. 淡出拖尾:通过半透明覆盖层实现粒子轨迹的淡出效果

  4. 自然分布:随机扰动使粒子分布更加自然,避免机械感

扩展思路

这个基础项目可以进一步扩展:

  1. 交互功能:添加鼠标交互,让爱心跟随鼠标或响应点击

  2. 颜色渐变:实现粒子颜色的动态变化

  3. 粒子系统:添加发射器,创建粒子流动效果

  4. 多爱心组合:渲染多个不同大小和旋转速度的爱心

结语

这个粉色粒子爱心项目展示了如何使用简单的数学原理和基础的图形编程技术创造出令人惊艳的视觉效果。通过调整参数,你可以创建出各种不同的3D形状和动画效果。希望这个项目能激发你对计算机图形学的兴趣!

完整代码已在文章开头提供,复制到Python环境中即可运行(需安装pygame库)。尝试修改参数,创造属于你自己的粒子艺术吧!

小提示:运行代码前请确保已安装pygame库,可以通过pip install pygame安装。

http://www.dtcms.com/a/109455.html

相关文章:

  • 《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例
  • VTK 各个点颜色的设置
  • 289.将所有数字用字符替换
  • 栈容器的应用
  • 代码随想录|动态规划|17一和零
  • DAY 35 leetcode 202--哈希表.快乐数
  • QT 非空指针 软件奔溃
  • 检索增强生成(RAG) 优化策略
  • LLM架构解析:长短期记忆网络(LSTM)(第三部分)—— 从基础原理到实践应用的深度探索
  • MyBatis:开源、轻量级的数据持久化框架
  • 游戏引擎学习第201天
  • Muduo网络库实现 [九] - EventLoopThread模块
  • 康谋分享 | 仿真驱动、数据自造:巧用合成数据重构智能座舱
  • 去中心化交易所(DEX)
  • Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
  • 【GCC警告报错4】warning: format not a string literal and no format arguments
  • 从扩展黎曼泽塔函数构造物质和时空的结构-13
  • 练习题:120
  • 【Linux学习笔记】开发工具git和gbd和cgbd的介绍和使用
  • PADS 9.5【附破解文件+安装教程】中文激活版下载
  • IP分片攻击实战模拟
  • 蓝桥杯真题——传送阵
  • xsync脚本是一个基于rsync的工具
  • LN2220 2A 高效率升压 DC/DC 电压调整器
  • 前端面试题(二):vue2中v-if和v-show的区别
  • 使用python完成手写数字识别
  • 列表某个字段由多个值组成,使用id匹配展示
  • Angular 项目 PDF 批注插件库在线版 API 示例教程
  • 儿童语义认知功能磁共振成像研究的元分析
  • Python+Playwright自动化测试-1-环境准备与搭建