En este tema, aprenderemos cómo resolver colisiones en videojuegos, un aspecto crucial para crear interacciones realistas entre objetos. La resolución de colisiones implica determinar cómo los objetos deben reaccionar después de una colisión, lo que incluye calcular nuevas posiciones y velocidades.

Conceptos Clave

  1. Impulso (Momentum): La cantidad de movimiento de un objeto, calculada como el producto de su masa y su velocidad.
  2. Conservación del Momento: En una colisión, el momento total de los objetos involucrados se conserva.
  3. Coeficiente de Restitución: Una medida de la elasticidad de una colisión, que determina cómo se comportan los objetos después de chocar.

Pasos para Resolver Colisiones

  1. Detección de Colisión:

    • Antes de resolver una colisión, primero debemos detectarla. Esto se cubre en detalle en el tema anterior (03-02-deteccion-colisiones).
  2. Cálculo del Punto de Colisión:

    • Determinar el punto exacto donde los objetos colisionan.
  3. Cálculo de la Normal de Colisión:

    • La normal de colisión es un vector perpendicular a la superficie de colisión en el punto de contacto.
  4. Cálculo de las Velocidades Relativas:

    • Determinar las velocidades de los objetos en la dirección de la normal de colisión.
  5. Aplicación de la Conservación del Momento y el Coeficiente de Restitución:

    • Utilizar estas leyes físicas para calcular las nuevas velocidades de los objetos después de la colisión.

Ejemplo Práctico

Supongamos que tenemos dos esferas que colisionan. Aquí está el proceso paso a paso para resolver la colisión:

Datos Iniciales

  • Masa de la esfera A: \( m_A \)
  • Velocidad inicial de la esfera A: \( \vec{v}_A \)
  • Masa de la esfera B: \( m_B \)
  • Velocidad inicial de la esfera B: \( \vec{v}_B \)
  • Coeficiente de restitución: \( e \)

Paso 1: Cálculo de la Normal de Colisión

La normal de colisión \( \vec{n} \) es el vector unitario que apunta desde el centro de la esfera A al centro de la esfera B en el punto de colisión.

import numpy as np

# Posiciones de las esferas en el momento de colisión
pos_A = np.array([x_A, y_A, z_A])
pos_B = np.array([x_B, y_B, z_B])

# Normal de colisión
normal = pos_B - pos_A
normal = normal / np.linalg.norm(normal)  # Normalizar el vector

Paso 2: Velocidades Relativas en la Dirección de la Normal

Calcular las velocidades relativas de las esferas en la dirección de la normal de colisión.

# Velocidades iniciales
v_A = np.array([vx_A, vy_A, vz_A])
v_B = np.array([vx_B, vy_B, vz_B])

# Velocidad relativa
relative_velocity = v_B - v_A

# Componente de la velocidad relativa en la dirección de la normal
relative_velocity_normal = np.dot(relative_velocity, normal)

Paso 3: Aplicación de la Conservación del Momento y el Coeficiente de Restitución

Calcular las nuevas velocidades después de la colisión.

# Coeficiente de restitución
e = 0.8  # Por ejemplo

# Impulso de colisión
impulse = (-(1 + e) * relative_velocity_normal) / (1/m_A + 1/m_B)

# Nuevas velocidades
v_A_new = v_A + (impulse / m_A) * normal
v_B_new = v_B - (impulse / m_B) * normal

Paso 4: Actualización de las Velocidades

Actualizar las velocidades de las esferas con los nuevos valores calculados.

# Actualizar las velocidades de las esferas
esfera_A.velocidad = v_A_new
esfera_B.velocidad = v_B_new

Ejercicio Práctico

Ejercicio 1

Dado un sistema de dos esferas con las siguientes características:

  • Esfera A: masa = 2 kg, velocidad inicial = (3, 0, 0) m/s
  • Esfera B: masa = 3 kg, velocidad inicial = (-1, 0, 0) m/s
  • Coeficiente de restitución = 0.9

Calcular las nuevas velocidades de las esferas después de la colisión.

Solución

  1. Normal de Colisión:

    • Supongamos que las esferas colisionan frontalmente en el eje x, por lo que la normal de colisión es (1, 0, 0).
  2. Velocidades Relativas:

    • Velocidad relativa en la dirección de la normal: \( \vec{v}_B - \vec{v}_A = (-1, 0, 0) - (3, 0, 0) = (-4, 0, 0) \)
  3. Aplicación de la Conservación del Momento y el Coeficiente de Restitución:

    • Impulso de colisión: \( \text{impulse} = \frac{-(1 + 0.9) \cdot (-4)}{(1/2) + (1/3)} = \frac{7.6}{0.833} \approx 9.12 \)
    • Nuevas velocidades:
      • \( \vec{v}A{\text{new}} = (3, 0, 0) + \frac{9.12}{2} \cdot (1, 0, 0) = (3 + 4.56, 0, 0) = (7.56, 0, 0) \)
      • \( \vec{v}B{\text{new}} = (-1, 0, 0) - \frac{9.12}{3} \cdot (1, 0, 0) = (-1 - 3.04, 0, 0) = (-4.04, 0, 0) \)

Resumen

En esta sección, hemos aprendido cómo resolver colisiones entre objetos en un videojuego utilizando principios físicos como la conservación del momento y el coeficiente de restitución. Hemos cubierto los pasos necesarios para calcular las nuevas velocidades de los objetos después de una colisión y hemos trabajado con un ejemplo práctico para reforzar estos conceptos. En la próxima sección, exploraremos cómo la fricción y el rebote afectan las colisiones y cómo podemos simular estos efectos en un entorno de videojuego.

© Copyright 2024. Todos los derechos reservados