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
Pas 1: Vector de col·lisió
Calcula el vector de col·lisió
Pas 2: Velocitats relatives
Calcula la velocitat relativa en la direcció de
Pas 3: Impuls
Calcula l'impuls
Pas 4: Noves velocitats
Actualitza les velocitats dels objectes:
- Col·lisions amb superfícies
Per a una esfera amb massa
Pas 1: Velocitat relativa
Calcula la velocitat relativa en la direcció de
Pas 2: Impuls
Calcula l'impuls
Pas 3: Nova velocitat
Actualitza la velocitat de l'esfera:
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ó:
(assumint una col·lisió frontal). - Velocitats relatives:
. - Impuls:
. - Noves velocitats:
m/s. 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:
. - Impuls:
. - Nova velocitat:
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