En este tema, exploraremos cómo los cuerpos rígidos (rigid bodies) interactúan entre sí dentro de un entorno de videojuego. Comprender estas interacciones es crucial para simular comportamientos realistas y dinámicos en los juegos.

Conceptos Clave

  1. Rigid Bodies: Objetos que no deforman bajo la acción de fuerzas. Se comportan como si fueran sólidos invariables.
  2. Fuerzas y Torques: Las fuerzas afectan la traslación de un cuerpo rígido, mientras que los torques afectan su rotación.
  3. Colisiones: Interacciones físicas donde dos o más cuerpos rígidos se encuentran y ejercen fuerzas entre sí.
  4. Fricción: Fuerza que resiste el movimiento relativo entre dos superficies en contacto.
  5. Rebote (Elasticidad): Capacidad de un cuerpo para recuperar su forma original después de una colisión.

Interacciones Básicas

Fuerzas y Torques

Las fuerzas y torques son fundamentales para la interacción entre cuerpos rígidos. Aquí hay un ejemplo básico de cómo aplicar una fuerza y un torque a un cuerpo rígido en un motor de física como Unity:

// Aplicar una fuerza en Unity
Rigidbody rb = GetComponent<Rigidbody>();
Vector3 force = new Vector3(0, 10, 0);
rb.AddForce(force);

// Aplicar un torque en Unity
Vector3 torque = new Vector3(0, 0, 10);
rb.AddTorque(torque);

Explicación:

  • Rigidbody rb = GetComponent<Rigidbody>();: Obtiene el componente Rigidbody del objeto.
  • Vector3 force = new Vector3(0, 10, 0);: Define una fuerza hacia arriba.
  • rb.AddForce(force);: Aplica la fuerza al cuerpo rígido.
  • Vector3 torque = new Vector3(0, 0, 10);: Define un torque alrededor del eje Z.
  • rb.AddTorque(torque);: Aplica el torque al cuerpo rígido.

Colisiones

Las colisiones son interacciones críticas en la física de videojuegos. Cuando dos cuerpos rígidos colisionan, se generan fuerzas que pueden cambiar sus velocidades y trayectorias.

Detección de Colisiones

En Unity, la detección de colisiones se maneja mediante métodos como OnCollisionEnter, OnCollisionStay, y OnCollisionExit.

void OnCollisionEnter(Collision collision)
{
    // Código para manejar la colisión
    Debug.Log("Colisión detectada con: " + collision.gameObject.name);
}

Explicación:

  • void OnCollisionEnter(Collision collision): Método que se llama cuando comienza una colisión.
  • Debug.Log("Colisión detectada con: " + collision.gameObject.name);: Imprime el nombre del objeto con el que se colisionó.

Resolución de Colisiones

La resolución de colisiones implica calcular las nuevas velocidades de los cuerpos después de la colisión. Esto se basa en principios de conservación de momento y energía.

void OnCollisionEnter(Collision collision)
{
    Rigidbody rb = GetComponent<Rigidbody>();
    Vector3 relativeVelocity = collision.relativeVelocity;
    Vector3 impulse = relativeVelocity * rb.mass;
    rb.AddForce(-impulse, ForceMode.Impulse);
}

Explicación:

  • Vector3 relativeVelocity = collision.relativeVelocity;: Obtiene la velocidad relativa en el punto de colisión.
  • Vector3 impulse = relativeVelocity * rb.mass;: Calcula el impulso basado en la masa del cuerpo rígido.
  • rb.AddForce(-impulse, ForceMode.Impulse);: Aplica una fuerza de impulso en la dirección opuesta para simular el rebote.

Fricción y Rebote

La fricción y el rebote son propiedades que afectan cómo los cuerpos rígidos interactúan durante y después de una colisión.

Fricción

La fricción se puede ajustar mediante los materiales físicos en Unity:

// Crear un material físico con fricción
PhysicMaterial material = new PhysicMaterial();
material.dynamicFriction = 0.6f;
material.staticFriction = 0.6f;
Collider collider = GetComponent<Collider>();
collider.material = material;

Explicación:

  • PhysicMaterial material = new PhysicMaterial();: Crea un nuevo material físico.
  • material.dynamicFriction = 0.6f;: Establece la fricción dinámica.
  • material.staticFriction = 0.6f;: Establece la fricción estática.
  • collider.material = material;: Asigna el material físico al colisionador del objeto.

Rebote (Elasticidad)

La elasticidad se ajusta mediante el coeficiente de restitución en los materiales físicos:

// Crear un material físico con elasticidad
PhysicMaterial material = new PhysicMaterial();
material.bounciness = 0.8f;
Collider collider = GetComponent<Collider>();
collider.material = material;

Explicación:

  • material.bounciness = 0.8f;: Establece el coeficiente de restitución (elasticidad).
  • collider.material = material;: Asigna el material físico al colisionador del objeto.

Ejercicio Práctico

Ejercicio 1: Simulación de Colisiones

Objetivo: Crear una escena en Unity donde dos cuerpos rígidos colisionen y reboten con fricción y elasticidad ajustadas.

Pasos:

  1. Crear un nuevo proyecto en Unity.
  2. Añadir dos objetos 3D (esferas) a la escena.
  3. Añadir componentes Rigidbody a ambas esferas.
  4. Crear un material físico con fricción y elasticidad ajustadas.
  5. Asignar el material físico a los colisionadores de las esferas.
  6. Aplicar fuerzas iniciales a las esferas para que colisionen.

Código de Ejemplo:

using UnityEngine;

public class CollisionSimulation : MonoBehaviour
{
    public Rigidbody sphere1;
    public Rigidbody sphere2;
    public PhysicMaterial physicsMaterial;

    void Start()
    {
        // Configurar el material físico
        physicsMaterial = new PhysicMaterial();
        physicsMaterial.dynamicFriction = 0.5f;
        physicsMaterial.staticFriction = 0.5f;
        physicsMaterial.bounciness = 0.7f;

        // Asignar el material físico a las esferas
        sphere1.GetComponent<Collider>().material = physicsMaterial;
        sphere2.GetComponent<Collider>().material = physicsMaterial;

        // Aplicar fuerzas iniciales
        sphere1.AddForce(new Vector3(10, 0, 0), ForceMode.Impulse);
        sphere2.AddForce(new Vector3(-10, 0, 0), ForceMode.Impulse);
    }
}

Explicación:

  • public Rigidbody sphere1; public Rigidbody sphere2;: Referencias a los cuerpos rígidos de las esferas.
  • public PhysicMaterial physicsMaterial;: Referencia al material físico.
  • physicsMaterial.dynamicFriction = 0.5f;: Ajusta la fricción dinámica.
  • physicsMaterial.staticFriction = 0.5f;: Ajusta la fricción estática.
  • physicsMaterial.bounciness = 0.7f;: Ajusta la elasticidad.
  • sphere1.AddForce(new Vector3(10, 0, 0), ForceMode.Impulse);: Aplica una fuerza inicial a la primera esfera.
  • sphere2.AddForce(new Vector3(-10, 0, 0), ForceMode.Impulse);: Aplica una fuerza inicial a la segunda esfera.

Solución

Al ejecutar el código, las dos esferas deberían moverse una hacia la otra, colisionar y rebotar, mostrando los efectos de la fricción y la elasticidad ajustadas.

Conclusión

En esta sección, hemos explorado cómo los cuerpos rígidos interactúan entre sí mediante fuerzas, torques, colisiones, fricción y rebote. Estos conceptos son fundamentales para crear simulaciones físicas realistas en videojuegos. En el próximo tema, profundizaremos en los constraints y joints, que permiten controlar y limitar el movimiento de los cuerpos rígidos de manera más precisa.

© Copyright 2024. Todos los derechos reservados