¿Cómo simular presión con partículas?

11

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 ...

  1. Saber cuándo detectar cuándo hay espacio para llenar y luego agregar esferas al espacio.
  2. Eliminar esferas del espacio cuando se está reduciendo.
  3. 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:

¡presión!.

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!

BeachRunnerJoe
fuente

Respuestas:

6

No estoy exactamente seguro de qué es lo que quieres lograr, ¿la pared empuja las partículas a medida que el espacio sale de la pantalla como una mecánica de juego?

En cuanto a sus tres puntos, creo que esos comportamientos surgirían si tratara sus partículas de la siguiente manera: haga que cada partícula rechace a todas las demás partículas inversamente proporcionales a la distancia, y también haga que choquen con las paredes de su espacio para detenerlas.

Las partículas muy juntas se repelen entre sí y, por lo tanto, se extienden para llenar el espacio vacío hasta que se detengan los obstáculos. Si / cuando las paredes se mueven para hacer el espacio más pequeño y empujan las partículas, serán empujadas más cerca de otras partículas, las rechazarán más fuerte, lo que a su vez empujará otras partículas, aumentando la presión general.

Esto sería bastante similar a una simulación de n cuerpos con atracción negativa, por lo que, dependiendo del número de partículas, podría ser bastante costoso calcular la repulsión para cada partícula con cada otra partícula. Podría intentar simplificar esto haciendo que cada partícula sea rechazada solo por el centro de gravedad promediado de su masa de partículas, lo que podría producir un comportamiento extraño en áreas largas y delgadas con curvas (sin embargo, su gas no se expande en áreas que se doblan lejos del centro de gravedad, por ejemplo).

En cuanto a la creación y eliminación de partículas (para asegurarse de que haya la cantidad correcta para llenar visualmente el espacio que supongo), probablemente querrá asegurarse de no simplemente agregar o eliminar partículas cuando falta la densidad, ya que eso introduciría más partículas que repelen otras partículas y, por lo tanto, aumentan o disminuyen la presión.

Por lo tanto, es posible que desee introducir un factor en el cálculo de repulsión, por ejemplo, comience con 1.0 y cuando agregue x partículas, cree el nuevo factor n / (n + x) donde n es el número de partículas totales antes de agregar las nuevas.


fuente
2

La presión (como en un gas) es solo el resultado de colisiones elásticas simples entre sus partículas y entre las partículas y la pared. Simplemente mide la cantidad de colisiones por vez con las paredes para obtener un valor para tu presión.

Las 2 ideas que da no tienen conexión directa con la presión, ya que la presión se da con una cantidad constante de partículas en una volumina cerrada y una temperatura dada (lo que hace que las partículas se muevan más rápido o más lento).

Si agrega partículas a este sistema cerrado, la presión debería aumentar, porque hay más energía en todo el sistema (acaba de agregar una nueva partícula con una temperatura <-> velocidad dada).

Aron_dc
fuente
las partículas deberían tener una masa para las colisiones elásticas, ya que se supone que las paredes tienen una masa cercana a + infinito
Aron_dc
Dije "la presión es la cantidad de colisiones por vez con las paredes", eso es 100% preciso. En una colisión elástica, toma el impulso de esa partícula y mide cuánto impulso se le da a la pared. Entonces, si una partícula choca en una dirección vertical hacia la pared, la pared recibe un impulso de 2mv (m = masa de partícula; v = velocidad de partícula). Entonces, realmente mides el impulso entrante en la pared. La partícula se refleja (v antes de la colisión = -v después de la colisión). Esto incluso ayuda a medir la presión de mezclas de diferentes gases (diferentes m para partículas).
Aron_dc
0

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.

jcora
fuente