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.
fuente
Respuestas:
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.
fuente
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
0
y1 - 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:groundDensity + waterDensity
que sus vecinos.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.
fuente