XPBD vs PBD: simulador de tela en tiempo real
Simulador de tela construido sobre PBD y evolucionado a XPBD, desacoplando la rigidez del material de las iteraciones del solver.
- Processing
- Java
- PeasyCam
- P3D
Contexto
La simulación basada en posiciones (PBD) es una familia de técnicas usadas en motores de física de tela, cuerdas, cuerpos blandos y fluidos. En lugar de calcular fuerzas y acelerar partículas, corrige directamente las posiciones para que cumplan restricciones. Es rápida y estable, y por eso está en motores como Havok Cloth, Nvidia PhysX y Unity Cloth.
Este proyecto es un simulador de tela construido desde cero sobre PBD, que evolucioné hacia XPBD (2016) al toparme con la limitación más conocida de la formulación clásica: la rigidez del material depende del solver, no solo de sus parámetros.
Overview
Empecé implementando un motor de partículas propio en Processing con las restricciones clásicas de PBD: distancia, shear, flexión y colisión con esferas. Funcionaba, pero la rigidez del paño cambiaba según cuántas iteraciones del solver ejecutara por frame — subir iteraciones para estabilizar la simulación endurecía la tela sin haber tocado ningún parámetro de material. Ese acoplamiento es el problema estructural de PBD.
Reescribí la proyección de restricciones usando la formulación XPBD, que introduce un parámetro de compliance con unidades físicas reales, desacoplando la rigidez del material del número de iteraciones. El resto del sistema — constraints, solver, integración — se mantuvo, pero ahora responde de forma predecible.
De PBD a XPBD: qué cambié
En PBD clásico la rigidez se controla con un parámetro k ∈ [0,1] sin unidades físicas, y el material simulado depende también de las iteraciones del solver y del timestep. La corrección de Müller (k' = 1 - (1-k)^(1/n)) compensa esto parcialmente, pero satura rápido: con materiales medianamente rígidos deja de funcionar y el problema vuelve.
XPBD resuelve esto reformulando la restricción como un problema físico real. Introduce el parámetro compliance (α), inverso de la rigidez y con unidades físicas (m/N). La proyección incorpora α̃ = α/dt² y un acumulador λ por restricción que registra la fuerza aplicada durante el paso. El resultado: α describe el material, las iteraciones describen la calidad de la convergencia — son ejes independientes.
Implementé ambas formulaciones dentro de la misma clase Constraint, lo que me permitió comparar directamente el comportamiento y confirmar que XPBD elimina el acoplamiento. La versión final del simulador usa XPBD en todas las restricciones.
Restricciones implementadas
Cuatro tipos de constraint: distancia (estructural), shear (ángulo entre aristas, gradiente analítico (I - vvᵀ)), flexión por triángulo (distancia vértice–punto medio de la base opuesta, más estable numéricamente que un ángulo diedro), y colisión con esfera con fricción tangencial de Coulomb y velocidad de superficie por rotación (ω × r).
Solver e integración
Solver Gauss-Seidel secuencial, 2 iteraciones por paso, dt = 20 ms (60 fps). Integración semi-implícita de Euler: predicción de posición, proyección de restricciones, reconstrucción de velocidad como v = (x - x_prev) / dt. Colisiones resueltas por fuerza bruta O(n·m) contra las esferas de la escena.
Estabilidad bajo tensión: apertura de esquinas
Para validar que las restricciones no colapsan bajo tensión fuerte, sometí un paño a la apertura simultánea de sus cuatro esquinas. La malla mantiene estabilidad numérica sin oscilación durante todo el movimiento.
Interacción con colisión: esfera sobre tela colgante
Con dos esquinas superiores fijas, una esfera se desplaza en línea recta atravesando el paño, ejercitando la restricción de colisión esfera-tela con fricción tangencial descrita arriba.
Links
- Repositorio: github.com/fernandoabadlopez/xpbd
- Position Based Dynamics, Müller et al., 2007
- XPBD: Position-Based Simulation of Compliant Constrained Dynamics, Macklin, Müller, Chentanez, 2016