用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 = 0self.angle_y = 0self.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.002self.angle_y += 0.003self.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 = 15distance = 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 = Truewhile 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.mzph.cn/diannao/76584.shtml

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

相关文章

在汇编层面理解MESI

理解MESI协议在汇编层面的表现需要结合缓存一致性机制和处理器指令执行的行为。以下是分步骤的解释: 1. MESI协议基础 MESI是缓存行(Cache Line)状态的协议,定义四种状态: Modified(修改)&…

爱瑞编程2025暑期CSP集训营开始招生啦!

一、什么是暑期CSP集训营? 为全力备战2025年9月CSP-J/S认证,举办的线下编程集训活动。 旨在通过高强度编程训练,帮助学员提升竞赛能力,冲刺一等奖。 二、为什么参加集训营? 高效编程特训:封闭式学习&…

问题大集10-git使用commit提交中文显示乱码

(1)问题 (2)解决步骤 1) 设置全局编码为 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2) 显示或设…

当AI开始“思考“:大语言模型的文字认知三部曲

引言:从《黑客帝国》说起 1999年上映的科幻经典《黑客帝国》描绘了一个令人震撼的未来图景——人类生活在一个由人工智能构造的数字矩阵中。当我们观察现代大型语言模型的工作原理时,竟发现与这个虚构世界有着惊人的相似:人们正在用矩阵以及矩…

Golang改进后的任务调度系统分析

以下是整合了所有改进点的完整代码实现: package mainimport ("bytes""context""fmt""io""log""net/http""sync""time""github.com/go-redis/redis/v8""github.com/robfig/…

前沿技术有哪些改变生活新趋势

太阳能技术正在改变的生活 它让移动设备有了新的能源选择 太阳能板能直接把阳光转成电能 这对户外活动或者电力不便的地方特别有用 比如现在市面上有不少太阳能充电宝 小巧便携 可以随时给手机平板充电 需要注意的是 这些设备得放在太阳下才能工作 但它们确实能让人在野外多用…

基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战

深度学习框架与大模型技术的融合正推动人工智能应用的新一轮变革。百度飞桨(PaddlePaddle)作为国内首个自主研发、开源开放的深度学习平台,近期推出的3.0版本针对大模型时代的开发痛点进行了系统性革新。其核心创新包括“动静统一自动并行”&…

C++设计模式-模板方法模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、基本介绍 模板方法模式(Template Method Pattern)是行为型设计模式,其核心思想是定义算法骨架,将具体步骤延迟到子类实现。如同烹饪菜谱的标准化流程:所有厨师遵循相同的操作流程(备料→烹饪→装盘&am…

Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)

一、Logback 在 Spring Boot 中,日志框架默认使用的是 Logback,Spring Boot 提供了对日志配置的简化 Spring Boot 默认会将日志输出到控制台,并且日志级别为 INFO 可以在 application.yaml 或 application.properties 文件中进行日志配置 …

Python 异步编程:如何将同步文件操作函数无缝转换为异步版本

在 Python 的异步编程世界中,os.path 模块的同步文件操作函数常常让我们陷入两难境地:直接使用它们会阻塞事件循环,降低程序性能;但这些函数又如此方便实用。今天,我将带你探索如何巧妙地将这些同步函数转换为异步版本,让你的异步程序既能享受高效的事件处理,又能无缝利…

CUDA概览

一、CUDA 是什么? CUDA(Compute Unified Device Architecture,计算统一设备架构)是 NVIDIA 于2006年推出的并行计算平台与编程模型,旨在通过 GPU 的大规模并行计算能力加速科学计算、数据处理、人工智能等领域的计算任…

CSS3学习教程,从入门到精通, 学院网站完整项目 - HTML5 + CSS3 实现(25)

学院网站完整项目 - HTML5 CSS3 实现 下面是一个完整的学院网站项目,包含主页、新闻列表页、新闻详情页和视频宣传页的实现。我将按照您的要求提供详细的代码和注释。 项目结构 college-website/ ├── index.html # 主页 ├── news-list.html …

Ubuntu离线安装mysql

在 Ubuntu 24.04 上离线安装 MySQL 的步骤如下(支持 MySQL 8.0 或 8.4): 一.安装方法 此次安装是按照方法一安装,其它方法供参考: 安装成功截图: 安全配置截图: sudo mysql_secure_installat…

SQL Server 2022 读写分离问题整合

跟着热点整理一下遇到过的SQL Server的问题,这篇来聊聊读写分离遇到的和听说过的问题。 一、读写分离实现方法 1. 原生高可用方案 1.1 Always On 可用性组(推荐方案) 配置步骤: -- 1. 启用Always On功能 USE [master] GO ALT…

【前端扫盲】postman介绍及使用

Postman 是一款专为 API 开发与测试设计的 全流程协作工具,程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明: 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法(GET/POS…

IdeaVim-AceJump

‌AceJump 是一款专为IntelliJ IDEA平台打造的开源插件,旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置,如变量名、方法调用或特定的字符串‌。无论是大型项目还是日常编程,AceJump 都能显著提升你的代码导航速度和效率。…

[C语言入门] 结构体

目录 1. 啥是结构体 2. 啥是结构体变量 3. 创建结构体变量的小细节 3.1 创建全局结构体变量(不推荐) 3.2 创建局部结构体变量(不推荐) 3.3 创建局部结构体变量Plus 4. 结构体在内存里面咋存? 5. 结构体作为参数…

贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包

贤小二c#版yolo标注训练工具集 欢迎使用贤小二AI标注训练系统v2.0 本课程所有演示程序全部免费 1、这节课程主要演示贤小二AI标注训练系统的使用,以及标注数据时注意事项和技巧; 2、本程序采用c# Net8.0框架开发,是贤小二开发的一款Yolo标注…

二分类交叉熵损失

二分类交叉熵损失(Binary Cross-Entropy Loss)是用于二分类问题的常见损失函数。它衡量的是模型输出的预测概率分布与真实标签之间的差异。 1 二分类问题 在二分类问题中,每个样本的目标输出是 0 或 1,表示样本属于某一类或另一类…

【C++】Cplusplus进阶

模板的进阶: 非类型模板参数 是C模板中允许使用具体值(而非类型)作为模板参数的特性。它们必须是编译时常量,且类型仅限于整型、枚举、指针、引用。(char也行) STL标准库里面也使用了非类型的模板参数。 …