Introducció
Els sistemes de partícules són una tècnica fonamental en la simulació de fenòmens naturals com el foc, la fum, la pluja, i altres efectes visuals en els videojocs. Aquest mòdul explorarà els conceptes bàsics dels sistemes de partícules, com es poden implementar i com es poden utilitzar per crear efectes realistes.
Conceptes Bàsics
Què és un Sistema de Partícules?
Un sistema de partícules és una col·lecció d'elements petits i independents (partícules) que es mouen i interactuen segons unes regles determinades per simular un fenomen complex.
Components d'un Sistema de Partícules
- Emissor de Partícules: El punt o àrea des d'on es generen les partícules.
- Partícules: Els elements individuals que constitueixen el sistema.
- Propietats de les Partícules: Inclouen la posició, velocitat, acceleració, vida útil, color, mida, etc.
- Actualització de les Partícules: Les regles que determinen com es mouen i canvien les partícules amb el temps.
- Renderització de les Partícules: Com es dibuixen les partícules a la pantalla.
Implementació d'un Sistema de Partícules
Creació d'un Emissor de Partícules
Un emissor de partícules és responsable de generar noves partícules. Pot ser un punt, una línia, una àrea o un volum.
class EmissorDeParticules:
def __init__(self, posicio, taxa_emissio):
self.posicio = posicio
self.taxa_emissio = taxa_emissio
self.particules = []
def emetre(self):
for _ in range(self.taxa_emissio):
nova_particula = Particula(self.posicio)
self.particules.append(nova_particula)Definició de les Partícules
Les partícules tenen propietats com la posició, velocitat, acceleració i vida útil.
class Particula:
def __init__(self, posicio):
self.posicio = posicio
self.velocitat = [0, 0]
self.acceleracio = [0, 0]
self.vida_util = 100 # en frames
def actualitzar(self):
self.velocitat[0] += self.acceleracio[0]
self.velocitat[1] += self.acceleracio[1]
self.posicio[0] += self.velocitat[0]
self.posicio[1] += self.velocitat[1]
self.vida_util -= 1Actualització del Sistema de Partícules
El sistema de partícules s'actualitza en cada frame del joc. Això implica actualitzar la posició de cada partícula i eliminar les partícules que han esgotat la seva vida útil.
def actualitzar_sistema(emissor):
for particula in emissor.particules:
particula.actualitzar()
emissor.particules = [p for p in emissor.particules si p.vida_util > 0]Renderització de les Partícules
La renderització de les partícules depèn del motor de joc que s'utilitzi. A continuació es mostra un exemple simple utilitzant Pygame.
import pygame
def renderitzar_particules(screen, emissor):
for particula in emissor.particules:
pygame.draw.circle(screen, (255, 255, 255), (int(particula.posicio[0]), int(particula.posicio[1])), 3)Exercicis Pràctics
Exercici 1: Crear un Emissor de Partícules
- Implementa un emissor de partícules que generi partícules en una posició fixa.
- Assigna una velocitat inicial aleatòria a cada partícula.
Exercici 2: Simular la Gravetat
- Afegeix una acceleració constant cap avall a cada partícula per simular la gravetat.
- Observa com canvia el moviment de les partícules.
Exercici 3: Efecte de Foc
- Modifica el color de les partícules per simular un efecte de foc.
- Fes que les partícules es facin més petites i es tornin més transparents a mesura que es mouen cap amunt.
Solucions als Exercicis
Solució Exercici 1
import random
class EmissorDeParticules:
def __init__(self, posicio, taxa_emissio):
self.posicio = posicio
self.taxa_emissio = taxa_emissio
self.particules = []
def emetre(self):
for _ in range(self.taxa_emissio):
velocitat_inicial = [random.uniform(-1, 1), random.uniform(-1, 1)]
nova_particula = Particula(self.posicio, velocitat_inicial)
self.particules.append(nova_particula)
class Particula:
def __init__(self, posicio, velocitat):
self.posicio = posicio
self.velocitat = velocitat
self.acceleracio = [0, 0]
self.vida_util = 100
def actualitzar(self):
self.velocitat[0] += self.acceleracio[0]
self.velocitat[1] += self.acceleracio[1]
self.posicio[0] += self.velocitat[0]
self.posicio[1] += self.velocitat[1]
self.vida_util -= 1Solució Exercici 2
class Particula:
def __init__(self, posicio, velocitat):
self.posicio = posicio
self.velocitat = velocitat
self.acceleracio = [0, 0.1] # Gravetat cap avall
self.vida_util = 100
def actualitzar(self):
self.velocitat[0] += self.acceleracio[0]
self.velocitat[1] += self.acceleracio[1]
self.posicio[0] += self.velocitat[0]
self.posicio[1] += self.velocitat[1]
self.vida_util -= 1Solució Exercici 3
class Particula:
def __init__(self, posicio, velocitat):
self.posicio = posicio
self.velocitat = velocitat
self.acceleracio = [0, -0.05] # Moviment cap amunt
self.vida_util = 100
self.color = (255, 100, 0) # Color inicial
def actualitzar(self):
self.velocitat[0] += self.acceleracio[0]
self.velocitat[1] += self.acceleracio[1]
self.posicio[0] += self.velocitat[0]
self.posicio[1] += self.velocitat[1]
self.vida_util -= 1
# Canviar el color i la mida
self.color = (255, int(100 * (self.vida_util / 100)), 0)
self.mida = int(3 * (self.vida_util / 100))
def renderitzar_particules(screen, emissor):
for particula in emissor.particules:
pygame.draw.circle(screen, particula.color, (int(particula.posicio[0]), int(particula.posicio[1])), particula.mida)Conclusió
Els sistemes de partícules són una eina poderosa per crear efectes visuals realistes en els videojocs. Comprendre els conceptes bàsics i saber com implementar-los permet als desenvolupadors simular una àmplia varietat de fenòmens naturals. Amb la pràctica, es poden crear efectes cada vegada més complexos i realistes.
Física de Videojocs
Mòdul 1: Introducció a la Física en Videojocs
Mòdul 2: Cinemàtica i Dinàmica
- Moviment Rectilini Uniforme (MRU)
- Moviment Rectilini Uniformement Accelerat (MRUA)
- Lleis de Newton
- Moviment Circular
Mòdul 3: Col·lisions i Respostes
Mòdul 4: Física de Rigid Bodies
- Introducció a Rigid Bodies
- Simulació de Rigid Bodies
- Interaccions entre Rigid Bodies
- Constraints i Joints
