引言
在計算機圖形學中,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()
效果特點
-
3D透視:粒子根據深度改變大小和亮度,遠處的粒子更小更暗
-
平滑動畫:三軸不同速度的旋轉創造出復雜的運動軌跡
-
淡出拖尾:通過半透明覆蓋層實現粒子軌跡的淡出效果
-
自然分布:隨機擾動使粒子分布更加自然,避免機械感
擴展思路
這個基礎項目可以進一步擴展:
-
交互功能:添加鼠標交互,讓愛心跟隨鼠標或響應點擊
-
顏色漸變:實現粒子顏色的動態變化
-
粒子系統:添加發射器,創建粒子流動效果
-
多愛心組合:渲染多個不同大小和旋轉速度的愛心
結語
這個粉色粒子愛心項目展示了如何使用簡單的數學原理和基礎的圖形編程技術創造出令人驚艷的視覺效果。通過調整參數,你可以創建出各種不同的3D形狀和動畫效果。希望這個項目能激發你對計算機圖形學的興趣!
完整代碼已在文章開頭提供,復制到Python環境中即可運行(需安裝pygame庫)。嘗試修改參數,創造屬于你自己的粒子藝術吧!
小提示:運行代碼前請確保已安裝pygame庫,可以通過
pip install pygame
安裝。