Estoy tratando de simular la presión con una colección de partículas esféricas en un juego de Unity que estoy construyendo. Un par de notas sobre el problema:
- El objetivo es llenar un espacio / vacío 2D en constante cambio con esferas pequeñas y sin fricción. El juego está tratando de simular la presión cada vez mayor de que más objetos sean empujados a este espacio.
- El nivel en sí se desplaza constantemente de izquierda a derecha, lo que significa que si el usuario no cambia las dimensiones del espacio, se reducirá automáticamente (la parte más a la izquierda del espacio se desplazará continuamente fuera de la pantalla).
Me pregunto cuáles son algunos enfoques que puedo tomar para abordar estos problemas ...
- Saber cuándo detectar cuándo hay espacio para llenar y luego agregar esferas al espacio.
- Eliminar esferas del espacio cuando se está reduciendo.
- Estrategias para simular la presión sobre las esferas de modo que "exploten hacia afuera" cuando se crea más espacio.
El enfoque actual que estoy contemplando es usar una pared en constante movimiento, que está fuera de la pantalla y se mueve con la pantalla, como lo ilustra esta imagen:
.
Esta pared en movimiento empujará y atrapará las esferas en el espacio. En cuanto a agregar nuevas esferas, iba a tener (1) esferas que se replicaran al detectar espacio libre, O (2) engendrarlas en el lado izquierdo del espacio (donde está la pared), empujando el resto de las esferas hacia llenar el espacio Preveo problemas con la idea # 1 porque esto probablemente no crearía / simularía realmente presión; la idea # 2 parece más prometedora, pero plantea la cuestión de cómo proporcionar una ubicación para que estas nuevas partículas de esfera se reproduzcan (y las ramificaciones de generarlas cuando NO HAY espacio).
Muchas gracias de antemano por su sabiduría!
En cada ciclo, debe iterar a través de todas sus partículas y luego calcular una fuerza final sobre esa partícula. Básicamente, la pared siempre les da un vector de fuerza positiva en el eje x, si están colisionando con él (partícula.x - partícula.r <= 0).
Luego, cada partícula con la que están colisionando también les da un vector de fuerza, dependiendo del ángulo entre ellas. ¡Recolecta estos ángulos para todas las partículas, calcula el promedio y listo!
Aquí también puedes usar muchas técnicas de optimización, solo busca un tutorial de física de bolas. Básicamente, desea iterar a través de cada par de partículas solo una vez y calcular el vector de fuerza para ambos y almacenarlo en ellos.
Esto simulará gases, básicamente, y si les das una fuerza constante, también líquidos, supongo.
En cuanto a la creación y eliminación de partículas, implemento una clase ParticleEmitter, que tiene una posición, dirección y algunas otras cosas útiles. Su ejemplo sería mejor con un emisor que pueda crear partículas en un cierto rango, o incluso mejor, un rectángulo.
fuente