¿Cómo puedo definir áreas llenas de agua?

9

Me gustaría mejorar mi pequeño motor de juego con una bonita simulación de agua. Para comenzar a trabajar en eso, necesito encontrar una forma adecuada de representar el agua en el juego. Desafortunadamente no conozco muchas representaciones diferentes, así que te preguntaré. Hay una pregunta similar que hice hace algún tiempo. Pero como no había formulado el problema con claridad, la respuesta es correcta, pero no la que estaba buscando.

En algunos juegos, el agua solo se define por un nivel de altura. Por ejemplo, todo bajo la altura de cero está bajo el agua. Vi esta representación en juegos (en su mayoría más antiguos). El problema es que me gustaría tener cuevas en el mundo al aire libre que no estén inundadas y con diferentes niveles de agua para cada lago y mar.

Otra representación más precisa de la presencia de agua son las partículas. Cada gota de agua se almacena como un punto en el espacio mundial. Para renderizarlos, podría usar técnicas como metaballs para que construyan una sola malla. Esta representación sería genial para el realismo, ya que podría calcular fácilmente la dinámica entre ellos. Lamentablemente, ninguna máquina puede calcular un océano de metabolas en tiempo real.

¿Hay otras formas de representar el agua en un motor? Me gustaría tener lagos dinámicos, por lo que definir el área del agua mediante una geometría estática no es una opción. Por ejemplo, si el jugador modifica el terreno para ensanchar un lago, el agua debería llenar esa bahía y el nivel general de agua de ese lago debería disminuir ligeramente.

danijar
fuente
2
¿Cómo se organiza su terreno en el motor? Existen diferentes técnicas para vóxel frente a mapa de altura frente a terreno polisoup (malla).
Exilyth
Se administra como una malla y el agua no debe intercambiar esa malla del terreno de manera diferente a otras mallas estáticas.
danijar
1
comercio o trato?
Tom 'Blue' Piddock
1
Hay algunas demostraciones muy buenas de este enfoque de metaball, pero no lo veo utilizable en ningún juego real que no esté completamente enfocado en el hecho de que la simulación del agua es físicamente creíble en algún momento. No veo una razón contra solo una malla, tampoco debería ser un problema hacer que se ajuste a los alrededores o incluso generarla en base a alguna simulación física. Pero eso es algo que solo quieres hacer si realmente lo necesitas. Como referencia para la simulación semi realista del agua, es posible que desee marcar "From Dust".
Slin
1
La solución de tamaño variable fue el problema del "océano de metabolas". Además, por supuesto, habría límites en la variación de tamaño dependiendo del volumen, ya que es un medio para optimizar el rendimiento, no alterar el volumen de agua. Simplemente agregue una consideración especial, como la cercanía al jugador y la superficie, para áreas que necesitan detalles como cascadas, afluentes, costas o arroyos.
Attackfarm

Respuestas:

3

No puedo decir qué se usa comúnmente, pero mi primer pensamiento sería usar un sistema de partículas con partículas de diferentes tamaños que representen agua de varios volúmenes. La parte superior del agua usaría partículas más pequeñas para formar las ondulaciones de la superficie y las ondas, el agua más cercana al jugador usaría las partículas más pequeñas para simular salpicaduras y pequeñas ondulaciones, mientras que cuanto más profunda o profunda sea el agua, mayores serán las partículas. . Esto permitiría un número dinámico de partículas que simulan agua de cualquier tamaño, la dinámica del agua a medida que cambia y un nivel de rendimiento razonable y controlado.

Puedo ver problemas con esta implementación, pero ciertamente parece una solución relativamente simple y "suficientemente buena" que un espectador / jugador dudaría en notar alguna vez desviaciones en la simulación.

Attackfarm
fuente
2

Si estaba utilizando un terreno basado en vóxel, podría, además de almacenar la densidad del suelo por vóxel, también podría almacenar un valor de agua que esté sujeto entre 0y 1 - groundDensity. Dibujar el agua sería tan simple como ejecutar un pase de cubos en marcha sobre los valores del agua. Simular el agua sería un poco más difícil, pero la premisa básica es que desea resolver el sistema de manera que:

  1. El agua debajo de la superficie debe llenar el resto del vóxel
  2. El agua a nivel de la superficie debe tener la misma densidad total groundDensity + waterDensityque sus vecinos.
  3. El agua puede desplazarse a cualquier vóxel inmediatamente adyacente y debajo de él, siempre que la densidad total del vecino sea menor que su densidad total

El algoritmo ideal se ejecutaría en un sombreador de cómputo, una ruta de ejecución por vóxel. Si desea obtener fantasía, también puede almacenar la velocidad del agua dentro de ese vóxel para efectos de simulación adicionales: por ejemplo, intentar distribuir una cantidad de agua proporcional a la velocidad a las celdas "señaladas" por el vector de velocidad. Estos datos de velocidad también podrían usarse para mover las olas, dibujar rápidos, etc.

jmegaffin
fuente
Lamentablemente no tengo terreno voxel, como se señala en los comentarios bajo la pregunta. Gracias de cualquier manera.
danijar