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ó.
- 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.
- 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)
- 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.
Matemàtiques 3D
Mòdul 1: Fonaments d'Àlgebra Lineal
- Vectors i Espais Vectorials
- Matrius i Determinants
- Sistemes d'Equacions Lineals
- Autovalors i Autovectors
Mòdul 2: Transformacions Lineals
- Definició i Propietats
- Matrius de Transformació
- Rotacions, Translacions i Escalats
- Composició de Transformacions