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 -= 1
Actualització 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 -= 1
Solució 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 -= 1
Solució 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