En aquest tema, explorarem la simulació de rigid bodies, que és fonamental per crear interaccions realistes en els videojocs. Els rigid bodies són objectes que no es deformen quan es mouen o col·lisionen. La seva simulació implica calcular forces, velocitats i col·lisions per representar el moviment de manera precisa.
Conceptes Clau
- Definició de Rigid Body
Un rigid body és un objecte que manté la seva forma i volum constants durant el moviment. A diferència dels soft bodies, els rigid bodies no es deformen.
- Propietats dels Rigid Bodies
Les propietats principals que defineixen un rigid body són:
- Massa: Quantitat de matèria en l'objecte.
- Inèrcia: Resistència a canvis en el moviment.
- Centre de Massa: Punt on es pot considerar que tota la massa de l'objecte està concentrada.
- Velocitat Lineal: Velocitat a la qual es mou l'objecte.
- Velocitat Angular: Velocitat a la qual l'objecte gira.
- Forces i Moments
Les forces aplicades a un rigid body poden causar translació (moviment lineal) i rotació (moviment angular). Les forces es poden aplicar en qualsevol punt de l'objecte, i els moments (o torques) són les forces que causen rotació.
Equacions de Moviment
- Equació de Newton per la Translació
La segona llei de Newton per la translació és: \[ F = m \cdot a \] on \( F \) és la força aplicada, \( m \) és la massa de l'objecte, i \( a \) és l'acceleració resultant.
- Equació de Rotació
L'equivalent per la rotació és: \[ \tau = I \cdot \alpha \] on \( \tau \) és el moment (torque), \( I \) és el moment d'inèrcia, i \( \alpha \) és l'acceleració angular.
- Actualització de la Posició i Orientació
Per actualitzar la posició i l'orientació d'un rigid body, utilitzem les següents equacions:
- Posició: \( \mathbf{p}_{t+1} = \mathbf{p}_t + \mathbf{v}_t \cdot \Delta t \)
- Orientació: \( \mathbf{q}_{t+1} = \mathbf{q}_t + \mathbf{\omega}_t \cdot \Delta t \)
on \( \mathbf{p} \) és la posició, \( \mathbf{v} \) és la velocitat lineal, \( \mathbf{q} \) és l'orientació (quaternion), \( \mathbf{\omega} \) és la velocitat angular, i \( \Delta t \) és el pas de temps.
Implementació Pràctica
- Configuració Inicial
Abans de començar la simulació, cal definir les propietats inicials del rigid body, com la massa, el centre de massa, i el moment d'inèrcia.
public class RigidBody
{
public float Mass { get; set; }
public Vector3 Position { get; set; }
public Quaternion Orientation { get; set; }
public Vector3 Velocity { get; set; }
public Vector3 AngularVelocity { get; set; }
public Matrix3x3 InertiaTensor { get; set; }
public RigidBody(float mass, Vector3 position, Quaternion orientation)
{
Mass = mass;
Position = position;
Orientation = orientation;
Velocity = Vector3.zero;
AngularVelocity = Vector3.zero;
InertiaTensor = CalculateInertiaTensor();
}
private Matrix3x3 CalculateInertiaTensor()
{
// Càlcul del tensor d'inèrcia basat en la forma de l'objecte
// Exemple per a un cub
float I = (1/6) * Mass * (sideLength * sideLength);
return new Matrix3x3(I, 0, 0, 0, I, 0, 0, 0, I);
}
}
- Aplicació de Forces i Moments
Les forces i moments es poden aplicar en qualsevol moment durant la simulació. Això afecta la velocitat lineal i angular del rigid body.
public void ApplyForce(Vector3 force, Vector3 point)
{
// Actualitzar la velocitat lineal
Vector3 acceleration = force / Mass;
Velocity += acceleration * Time.deltaTime;
// Actualitzar la velocitat angular
Vector3 torque = Vector3.Cross(point - Position, force);
Vector3 angularAcceleration = InertiaTensor.inverse * torque;
AngularVelocity += angularAcceleration * Time.deltaTime;
}
- Actualització de l'Estat
Durant cada pas de temps de la simulació, cal actualitzar la posició i l'orientació del rigid body.
public void Update(float deltaTime)
{
// Actualitzar la posició
Position += Velocity * deltaTime;
// Actualitzar l'orientació
Quaternion deltaRotation = Quaternion.Euler(AngularVelocity * deltaTime);
Orientation = deltaRotation * Orientation;
}Exercici Pràctic
Exercici
Implementa una simulació bàsica d'un rigid body en un motor de física de la teva elecció (Unity, Unreal Engine, etc.). Defineix un cub amb propietats inicials i aplica una força constant per veure com es mou i rota.
Solució
// Unity Script
public class RigidBodySimulation : MonoBehaviour
{
public float mass = 1.0f;
public Vector3 initialPosition = Vector3.zero;
public Quaternion initialOrientation = Quaternion.identity;
public Vector3 force = new Vector3(10, 0, 0);
public Vector3 forceApplicationPoint = new Vector3(0, 1, 0);
private RigidBody rigidBody;
void Start()
{
rigidBody = new RigidBody(mass, initialPosition, initialOrientation);
}
void Update()
{
rigidBody.ApplyForce(force, forceApplicationPoint);
rigidBody.Update(Time.deltaTime);
// Actualitzar la posició i orientació del GameObject
transform.position = rigidBody.Position;
transform.rotation = rigidBody.Orientation;
}
}Conclusió
En aquesta secció, hem après els conceptes bàsics de la simulació de rigid bodies, incloent les propietats fonamentals, les equacions de moviment, i com implementar una simulació bàsica. Aquest coneixement és essencial per crear interaccions realistes en els videojocs. En la següent secció, explorarem les interaccions entre múltiples rigid bodies i com gestionar les col·lisions entre ells.
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
