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:

  1. Tipus de Col·lisions
  2. Respostes a les Col·lisions
  3. Càlcul de la Resolució de Col·lisions
  4. 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:

  1. Respostes impulsives: Ajusten les velocitats instantàniament basant-se en la quantitat de moviment i l'energia.
  2. 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

  1. 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} \]

  1. 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ó:

  1. Vector de col·lisió: \(\mathbf{n} = 1\) (assumint una col·lisió frontal).
  2. Velocitats relatives: \(\mathbf{v}_{rel} = -2 - 5 = -7\).
  3. Impuls: \(j = \frac{-(1 + 0.9) \cdot (-7)}{\frac{1}{2} + \frac{1}{3}} = \frac{13.3}{0.833} = 16\).
  4. 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ó:

  1. Velocitat relativa: \(\mathbf{v}_{rel} = 10\).
  2. Impuls: \(j = -(1 + 0.8) \cdot 10 = -18\).
  3. 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.

© Copyright 2024. Tots els drets reservats