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!
2d
water
fluid-dynamics
Pandaqi
fuente
fuente
Respuestas:
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.
fuente
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.
fuente