Creación de lluvia 2D (y dinámica de fluidos)

11

Estoy experimentando con las condiciones climáticas en un juego mío, y me impresionó la forma en que Starbound manejó la lluvia. Básicamente, cuando la lluvia cae al suelo, se dispersa horizontalmente (y es absorbida por el suelo) o crea montones de agua (cuando las gotas de lluvia caen dentro de un agujero en el suelo).

Este video demuestra esto claramente: http://imgur.com/gallery/CKCGKbG

Sé cómo hacer que llueva y comprobar dónde golpea el suelo, pero ahí es donde me quedo atascado. Mi pregunta es: ¿cómo podría haberse creado esto? ¿Y cómo podría uno modelar el flujo de agua tan perfectamente, sin afectar el rendimiento?

¡Gracias por adelantado!

Pandaqi
fuente
1
La clave es el sistema de dinámica de fluidos. Sospecho que cuando una gota de lluvia toca el suelo, genera una pequeña cantidad de agua en esa posición que luego es procesada por el sistema de dinámica de fluidos como de costumbre. En superficies planas se contrarresta por evaporación, pero cuando las pendientes hacen que el agua se concentre en un área, la afluencia es más fuerte que la evaporación y comienzan a formarse charcos.
Philipp

Respuestas:

9

El sistema de agua de Starbound es en realidad autómatas celulares basados ​​en mosaicos 2D. Cada mosaico en la pantalla que no contiene una capa de mosaico frontal, es capaz de retener agua. La cantidad de agua se calcula mediante autómatas celulares.

Más información sobre esta técnica aquí:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

En cuanto a las gotas de lluvia, esas son partículas. Sirven principalmente para fingir que en realidad hay agua que cae del cielo. El agua se acumula solo porque el juego sabe que actualmente está lloviendo. Las gotas individuales no tienen nada que ver con la formación real de las piscinas de agua.

La forma en que se acumulan es determinando dónde hay agujeros en la capa superior del suelo. Si hay un área que puede acumular agua, las células en esa área incrementan sus niveles de agua en consecuencia.

Starbound también se ocupa de la presión del agua, y su técnica de renderizado es bastante sorprendente. Tienen la mejor implementación 2D de la física de simulaciones de agua usando autómatas celulares que he visto.

Aquí hay una vista primitiva de un motor de física de líquidos, utilizando la técnica de autómatas celulares mencionada anteriormente. La parte de representación se vuelve un poco más compleja, ya que su agua está representada por un valor numérico.

http://www.jgallant.com/images/pressuretest.gif

En este ejemplo, una mejora muy simple sería ocultar las celdas de agua que tienen menos de 1 unidad completa de agua en su mosaico si no hay un mosaico sólido debajo. Pero entonces, estás ocultando el flujo de agua. En lugar de ocultarlo, tendrías que determinar cómo fluye el agua y luego dibujar el sprite de agua apropiado en su lugar.

jgallant
fuente
2
Para agregar al hecho de que las partículas de gota de lluvia simulan el efecto de caída de agua: las pequeñas salpicaduras de gotas en la superficie tampoco están relacionadas con las partículas de lluvia reales sino con un efecto separado. La combinación hace que parezca que las gotas hacen las salpicaduras.
Felsir
Wow, eso es exactamente lo que estaba buscando. Pensé que tendría que recurrir a un sistema de fluidos demasiado complejo basado en partículas, pero los sistemas de rejilla parecen funcionar igual de bien. Sin embargo, para agregar presión de agua, supongo que solo necesita una segunda matriz que almacena valores de presión y fluye desde lugares de alta presión a lugares de baja presión. Si es así, eso no debería ser demasiado difícil para la computadora.
Pandaqi
No, todo lo que necesita hacer con la presión es agregar una regla como, por ejemplo, un azulejo puede contener más de 1 unidad completa de líquido. Si ese mosaico tiene más de 1 unidad completa de líquido y no puede fluir según el conjunto normal de reglas, entonces haga que fluya hacia arriba. Ajuste de modo que permita que fluya más agua según el valor presurizado de esa loseta.
jgallant
3

Hay muchas maneras de abordar esto. Como siempre "depende"

Entonces, supongo que una forma sería así ... Dado un arbitrario 'sumergirse en el suelo' Superponga una 'caja de agua' que lo limita. El suelo y la caja de agua se dibujan en capas para que el suelo se muestre primero, luego la caja de agua.

Cada vez que una gota de agua golpea la inmersión en el suelo, agregue una a la caja de agua. Cuando la caja de agua alcanza un número mágico, agrega una línea de agua. Entonces, digamos que 10 gotas caen en el baño, esto agrega una línea a la caja de agua.

Entonces, digamos que el waterbox tiene 32X32 píxeles. Agregue una línea de color de agua de 0,31 a 31,31. Otras 10 gotas, dibuja una línea de 0,30 a 31,30. Entonces, a medida que se acumulan las gotas, se acumula la caja de agua desde el fondo hasta que se llena.

Espero que tenga sentido.

RobM
fuente