La simulació física és una part fonamental en la creació de gràfics 3D realistes. Aquest tema cobreix els conceptes bàsics de la física aplicada a la simulació d'objectes i entorns en tres dimensions. Aprendrem com aplicar les lleis de la física per simular moviments, col·lisions i altres fenòmens naturals.

Objectius del Tema

  • Comprendre els principis bàsics de la simulació física.
  • Aplicar les lleis de Newton en la simulació d'objectes 3D.
  • Implementar col·lisions i resposta a col·lisions.
  • Simular forces com la gravetat i la fricció.

  1. Principis Bàsics de la Simulació Física

1.1. Cinemàtica

La cinemàtica és l'estudi del moviment dels objectes sense considerar les forces que el causen. Els conceptes clau inclouen:

  • Posició (x, y, z): La ubicació d'un objecte en l'espai.
  • Velocitat (v): El canvi de posició per unitat de temps.
  • Acceleració (a): El canvi de velocitat per unitat de temps.

Equacions de la Cinemàtica

Les equacions bàsiques de la cinemàtica són: \[ v = v_0 + a \cdot t \] \[ x = x_0 + v_0 \cdot t + \frac{1}{2} a \cdot t^2 \]

1.2. Dinàmica

La dinàmica estudia les forces que causen el moviment. Les lleis de Newton són fonamentals:

  • Primera llei de Newton: Un objecte en repòs o en moviment rectilini uniforme continuarà en aquest estat a menys que una força externa actuï sobre ell.
  • Segona llei de Newton: La força aplicada a un objecte és igual a la massa de l'objecte multiplicada per la seva acceleració (F = m * a).
  • Tercera llei de Newton: Per cada acció, hi ha una reacció igual i oposada.

  1. Aplicació de les Lleis de Newton

2.1. Simulació de Moviment

Per simular el moviment d'un objecte, cal actualitzar la seva posició i velocitat en cada pas de temps. Això es pot fer utilitzant les equacions de la cinemàtica i la segona llei de Newton.

Exemple de Codi: Simulació de Moviment

class Objecte:
    def __init__(self, massa, posicio, velocitat):
        self.massa = massa
        self.posicio = posicio
        self.velocitat = velocitat
        self.forces = []

    def aplicar_forca(self, forca):
        self.forces.append(forca)

    def actualitzar(self, dt):
        # Sumar totes les forces aplicades
        forca_total = sum(self.forces, start=Vector(0, 0, 0))
        # Calcula l'acceleració
        acceleracio = forca_total / self.massa
        # Actualitza la velocitat
        self.velocitat += acceleracio * dt
        # Actualitza la posició
        self.posicio += self.velocitat * dt
        # Neteja les forces aplicades
        self.forces = []

# Exemple d'ús
objecte = Objecte(massa=1.0, posicio=Vector(0, 0, 0), velocitat=Vector(0, 0, 0))
gravetat = Vector(0, -9.81, 0)
objecte.aplicar_forca(gravetat)
objecte.actualitzar(dt=0.1)
print(objecte.posicio)

2.2. Col·lisions i Resposta a Col·lisions

Les col·lisions són un aspecte crític en la simulació física. Quan dos objectes col·lideixen, cal calcular la resposta a la col·lisió per determinar les noves velocitats i posicions.

Exemple de Codi: Col·lisió Simple

def detectar_colisio(objecte1, objecte2):
    distància = (objecte1.posicio - objecte2.posicio).magnitude()
    return distància < (objecte1.radi + objecte2.radi)

def resposta_colisio(objecte1, objecte2):
    normal = (objecte1.posicio - objecte2.posicio).normalize()
    velocitat_relativa = objecte1.velocitat - objecte2.velocitat
    velocitat_along_normal = velocitat_relativa.dot(normal)
    
    if velocitat_along_normal > 0:
        return
    
    e = min(objecte1.elasticitat, objecte2.elasticitat)
    j = -(1 + e) * velocitat_along_normal
    j /= 1 / objecte1.massa + 1 / objecte2.massa
    
    impuls = j * normal
    objecte1.velocitat += impuls / objecte1.massa
    objecte2.velocitat -= impuls / objecte2.massa

# Exemple d'ús
if detectar_colisio(objecte1, objecte2):
    resposta_colisio(objecte1, objecte2)

  1. Forces Comunes en Simulació Física

3.1. Gravetat

La gravetat és una força constant que actua sobre tots els objectes amb massa. En la simulació, sovint es representa com una acceleració constant cap avall.

3.2. Fricció

La fricció és una força que s'oposa al moviment. Pot ser modelada com una força proporcional a la velocitat de l'objecte.

3.3. Forces de Molla

Les forces de molla segueixen la llei de Hooke, que diu que la força és proporcional a la deformació de la molla.

Exemple de Codi: Força de Molla

def força_molla(posicio, posicio_equilibri, constant_molla):
    deformacio = posicio - posicio_equilibri
    return -constant_molla * deformacio

# Exemple d'ús
posicio = Vector(1, 0, 0)
posicio_equilibri = Vector(0, 0, 0)
constant_molla = 10
força = força_molla(posicio, posicio_equilibri, constant_molla)
print(força)

Exercicis Pràctics

Exercici 1: Simulació de Caiguda Lliure

Simula la caiguda lliure d'un objecte sota la influència de la gravetat. Calcula la seva posició i velocitat després de 5 segons.

Exercici 2: Col·lisió entre Dos Objectes

Implementa una simulació de col·lisió entre dos objectes esfèrics. Calcula les noves velocitats després de la col·lisió.

Exercici 3: Simulació d'una Molla

Simula el moviment d'un objecte connectat a una molla. Calcula la seva posició i velocitat en funció del temps.

Solucions dels Exercicis

Solució 1: Simulació de Caiguda Lliure

objecte = Objecte(massa=1.0, posicio=Vector(0, 0, 0), velocitat=Vector(0, 0, 0))
gravetat = Vector(0, -9.81, 0)
temps_total = 5.0
dt = 0.1
for t in range(int(temps_total / dt)):
    objecte.aplicar_forca(gravetat)
    objecte.actualitzar(dt)
print(objecte.posicio)

Solució 2: Col·lisió entre Dos Objectes

objecte1 = Objecte(massa=1.0, posicio=Vector(0, 0, 0), velocitat=Vector(1, 0, 0), radi=0.5, elasticitat=0.9)
objecte2 = Objecte(massa=1.0, posicio=Vector(1, 0, 0), velocitat=Vector(-1, 0, 0), radi=0.5, elasticitat=0.9)
if detectar_colisio(objecte1, objecte2):
    resposta_colisio(objecte1, objecte2)
print(objecte1.velocitat, objecte2.velocitat)

Solució 3: Simulació d'una Molla

objecte = Objecte(massa=1.0, posicio=Vector(1, 0, 0), velocitat=Vector(0, 0, 0))
posicio_equilibri = Vector(0, 0, 0)
constant_molla = 10
temps_total = 5.0
dt = 0.1
for t in range(int(temps_total / dt)):
    força = força_molla(objecte.posicio, posicio_equilibri, constant_molla)
    objecte.aplicar_forca(força)
    objecte.actualitzar(dt)
print(objecte.posicio)

Resum

En aquest tema, hem explorat els fonaments de la simulació física aplicats a gràfics 3D. Hem après a aplicar les lleis de Newton per simular moviments, col·lisions i forces comunes com la gravetat i la fricció. Els exercicis pràctics proporcionen una oportunitat per aplicar aquests conceptes i reforçar l'aprenentatge. Amb aquests coneixements, estem preparats per crear simulacions físiques més complexes i realistes en entorns 3D.

© Copyright 2024. Tots els drets reservats