用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.pswp.cn/diannao/76584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76584.shtml
英文地址,請注明出處:http://en.pswp.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標準庫里面也使用了非類型的模板參數。 …