En aquest tema, aprendrem com resoldre col·lisions en un entorn de videojoc. La resolució de col·lisions és crucial per garantir que els objectes interactuïn de manera realista i coherent dins del joc. Ens centrarem en els següents conceptes clau:
- Tipus de Col·lisions
- Respostes a les Col·lisions
- Càlcul de la Resolució de Col·lisions
- Implementació en Motors de Física
Tipus de Col·lisions
Abans de resoldre una col·lisió, és important identificar el tipus de col·lisió que ha ocorregut. Els tipus més comuns són:
- Col·lisions elàstiques: On l'energia cinètica total es conserva.
- Col·lisions inelàstiques: On part de l'energia cinètica es converteix en altres formes d'energia, com calor o deformació.
- Col·lisions perfectament inelàstiques: On els objectes queden units després de la col·lisió.
Respostes a les Col·lisions
La resposta a una col·lisió implica ajustar les velocitats i posicions dels objectes implicats per reflectir la interacció física. Hi ha diverses tècniques per gestionar aquestes respostes:
- Respostes impulsives: Ajusten les velocitats instantàniament basant-se en la quantitat de moviment i l'energia.
- Respostes contínues: Ajusten les velocitats i posicions de manera gradual durant un període de temps.
Càlcul de la Resolució de Col·lisions
- Col·lisions entre dos objectes
Per a dues esferes \(A\) i \(B\) amb masses \(m_A\) i \(m_B\), velocitats inicials \(\mathbf{v}_A\) i \(\mathbf{v}_B\), i posicions \(\mathbf{p}_A\) i \(\mathbf{p}_B\), la resolució de col·lisions es pot calcular de la següent manera:
Pas 1: Vector de col·lisió
Calcula el vector de col·lisió \(\mathbf{n}\):
\[ \mathbf{n} = \frac{\mathbf{p}_B - \mathbf{p}_A}{|\mathbf{p}_B - \mathbf{p}_A|} \]
Pas 2: Velocitats relatives
Calcula la velocitat relativa en la direcció de \(\mathbf{n}\):
\[ \mathbf{v}_{rel} = (\mathbf{v}_B - \mathbf{v}_A) \cdot \mathbf{n} \]
Pas 3: Impuls
Calcula l'impuls \(j\) utilitzant el coeficient de restitució \(e\) (on \(0 \leq e \leq 1\)):
\[ j = \frac{-(1 + e) \mathbf{v}_{rel}}{\frac{1}{m_A} + \frac{1}{m_B}} \]
Pas 4: Noves velocitats
Actualitza les velocitats dels objectes:
\[ \mathbf{v}_A' = \mathbf{v}_A + \frac{j}{m_A} \mathbf{n} \] \[ \mathbf{v}_B' = \mathbf{v}_B - \frac{j}{m_B} \mathbf{n} \]
- Col·lisions amb superfícies
Per a una esfera amb massa \(m\), velocitat inicial \(\mathbf{v}\), i normal de la superfície \(\mathbf{n}\):
Pas 1: Velocitat relativa
Calcula la velocitat relativa en la direcció de \(\mathbf{n}\):
\[ \mathbf{v}_{rel} = \mathbf{v} \cdot \mathbf{n} \]
Pas 2: Impuls
Calcula l'impuls \(j\):
\[ j = -(1 + e) \mathbf{v}_{rel} \]
Pas 3: Nova velocitat
Actualitza la velocitat de l'esfera:
\[ \mathbf{v}' = \mathbf{v} + \frac{j}{m} \mathbf{n} \]
Implementació en Motors de Física
Unity
En Unity, la resolució de col·lisions es pot gestionar utilitzant el component Rigidbody
i els mètodes de col·lisió proporcionats per la API de física de Unity.
void OnCollisionEnter(Collision collision) { Rigidbody rb = GetComponent<Rigidbody>(); Vector3 normal = collision.contacts[0].normal; Vector3 relativeVelocity = collision.relativeVelocity; float e = 0.8f; // Coeficient de restitució Vector3 impulse = -(1 + e) * Vector3.Dot(relativeVelocity, normal) * normal; rb.velocity += impulse / rb.mass; }
Unreal Engine
En Unreal Engine, la resolució de col·lisions es pot gestionar utilitzant el component UPrimitiveComponent
i els esdeveniments de col·lisió.
void AMyActor::NotifyHit( class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit ) { FVector relativeVelocity = OtherComp->GetComponentVelocity() - MyComp->GetComponentVelocity(); float e = 0.8f; // Coeficient de restitució FVector impulse = -(1 + e) * FVector::DotProduct(relativeVelocity, HitNormal) * HitNormal; MyComp->AddImpulse(impulse); }
Exercicis Pràctics
Exercici 1: Col·lisió entre dues esferes
Dues esferes amb masses de 2 kg i 3 kg es mouen amb velocitats de 5 m/s i -2 m/s respectivament. Calcula les noves velocitats després de la col·lisió si el coeficient de restitució és 0.9.
Solució:
- Vector de col·lisió: \(\mathbf{n} = 1\) (assumint una col·lisió frontal).
- Velocitats relatives: \(\mathbf{v}_{rel} = -2 - 5 = -7\).
- Impuls: \(j = \frac{-(1 + 0.9) \cdot (-7)}{\frac{1}{2} + \frac{1}{3}} = \frac{13.3}{0.833} = 16\).
- Noves velocitats:
- \(\mathbf{v}_A' = 5 + \frac{16}{2} = 13\) m/s.
- \(\mathbf{v}_B' = -2 - \frac{16}{3} = -7.33\) m/s.
Exercici 2: Col·lisió amb una superfície
Una esfera de 1 kg es mou amb una velocitat de 10 m/s cap a una paret. Calcula la nova velocitat després de la col·lisió si el coeficient de restitució és 0.8.
Solució:
- Velocitat relativa: \(\mathbf{v}_{rel} = 10\).
- Impuls: \(j = -(1 + 0.8) \cdot 10 = -18\).
- Nova velocitat: \(\mathbf{v}' = 10 + \frac{-18}{1} = -8\) m/s.
Resum
En aquesta secció, hem après els conceptes bàsics de la resolució de col·lisions, incloent els tipus de col·lisions, les respostes a les col·lisions, i com calcular la resolució de col·lisions tant entre objectes com amb superfícies. També hem vist exemples pràctics d'implementació en Unity i Unreal Engine. Amb aquests coneixements, estem preparats per gestionar col·lisions de manera efectiva en els nostres videojocs.
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