WaveMaker es un asset de simulación de olas que crea una malla rectangular que se modifica en tiempo real para parecer líquido al interactuar con ella. Su forma de mostrarse es responsabilidad del usuario.
Crear piscinas, portales, estanques, ríos con formas simples. Pequeños, medianos o largos.
Generar olas reaccionando a los colliders elegidos
Aplicar fuerzas a rigidbodies y hacerlos flotar y desplazarse a la deriva a la vez que creando olas debido a la ocupación de volúmen. Configuraciones complejas y superpuestas soportadas.
Crear ondas que parecen tanto agua como barro, crema y líquidos más densos.
Reaccionar a objetos estáticos al dibujar áreas de la superficie que queremos fijas
Funciona como cualquier otra malla con tu propio material (ocultar partes con transparencia, cambiar el aspecto usando shaders, usando el API para generar tus propios efectos)
Puntos clave comparados con otros assets similares ...
Esto es un modificador de mallas, no un truco visual (un shader 2D con o sin offset vertical). Las olas son más correctas y están simuladas en 3D en CPU. Los dispositivos con limitaciones GPU no tendrán problemas.
No necesitas shaders específicos para este asset, si tu shader funciona en una malla normal, funcionará con WaveMaker, es decir, soporta todos los pipelines de rendering que tu shader.
Este es un sistema two-way coupling: El fluido mueve objetos, se calcula la ocupación de volumen y los objetos generan olas a la vez. Si te fijas, la mayoría de sistemas con buoyancy no pueden hacer esto, permitiendo más interacción para tus juegos.
Puedes utilizar el API de los interactors y las superficies para obtener datos de la simulación y utilizarlos para tus propios propósitos.
Lo que NO puede hacer en la versión actual...
Las olas no rompen.
No está pensado para grandes superficies como océanos, formas de río complicadas y cascadas.
No es un shader de fluido, es un modificador de malla. No se incluyen FXs. Debes utilizar tus propios materiales y shaders.
No hay salpicaduras, espuma ni otros FXs. Pero puedes usar los datos de la malla y el API para aplicarlos por tu cuenta
Efectos aerodinámicos (viento, remolinos, etc), efectos de costa o playa
Comportamiento diferente del fluido según la profundidad del agua
Los Interactors no pueden usar MeshColliders. Hay que utilizar colliders más sencillos
Algunas de estas características serán añadidas poco a poco en el futuro. Por favor, visita el tracker de sugerencias y bugs. to know what's coming up.
Características actuales
Soporte para Unity desde la v2020.3.48+ hasta 2023.2.16, y todos los pipelines de render
Simulación en tiempo real de fluidos en CPU basada en campos de altura.
Las propiedades de la malla se actualizan en tiempo real para reaccionar correctamente a la iluminación.
Independiente de la jerarquía en la escena.
Para metros para cambiar la velocidad de las olas, duración y suavizado. Substepping para evitar inestabilidades.
Modo simple de interacción basado en la velocidad relativa para cualquier orientación de la superficie.
Modo avanzado de interacción basado en ocupación de volúmen de líquido para capacidades más avanzadas en superficies horizontales como flotación y deriva (Buoyancy y Drifting)
Posición, rotación, longitud y ancho de la superficie arbitrario.
Es posible fijar zonas de la superficie manualmente o automáticamente para ignorarlas y generar choques en ellas.
Independiente del timestep.
Código de calidad, completamente documentado con un API de acceso y todas las fuentes en c# incluidas. Assemblies y namespaces propios.
El código saca partido al completo de multihilo usando Jobs y Burst, con un coste en CPU muy pequeño.
Estado de reposo en superficies para reducir la computación al mínimo.
Incluidas muchas escenas de ejemplo y menús de creación automáticos.
Cómo instalar, documentación, tutoriales y demos
Limitaciones conocidas
Las olas no rompen. (a menos que alguno tengamos alguna idea que lo resuelva): Este método está basado en campos de altura, lo que significa que solo hay una altura
por posición en la superficie. Una ola que rompa tendría varias alturas en la misma posición. Esto requeriría utilizar algún truco para añadirlas aparte y sería un proceso costoso de momento.
Las fronteras abiertas son todavía imperfectas. Incluso cuando no están fijados los bordes de una superficie, un porcentaje de la onda es devuelto. Todavía estoy tratando de resolverlo.
No hay soporte para Mesh Colliders. Dado que tengo que crear mis propios colliders para algunas operaciones, este tipo de collider es el más complejo y sería demasiado lento para el actual estado del sistema.
Varias superficies no pueden combinarse. La forma de la superficie es rectangular y tiene una resolución máxima que permita 56 mil vértices. Esta característica nos permitiría
ser más creativos pero actualmente la única forma de conseguir esto es crear una superficie mucho mayor, ocultar partes de ella usando nuestros propios materiales transparentes y fijar las celdas que no
queremos simular, haciendo que sea más eficiente.
En el modo de interacción basada en velocidad, aparecen pequeñas olas incluso cuando interactor y superficie giran juntos: El movimiento relativo entre ambos
se utiliza para generar olas. Trasladar ambos juntos no debería generar olas. Sin embargo, si ambos se rotan juntos bajo el mismo padre se generan pequeñas inestabilidades.
Lamentablemente esto es debido a la falta de precisión en el cálculo de la velocidad angular de ambos objetos.
Una solución sería hacer el sistema más flexible asociando cada interactor a cada superficie y calcular la velocidad del interactor respecto a la superficie,
pero no merece la pena cambiar todo a menos que haya una razón de peso que alguien quiera compartir conmigo.
Sigue las novedades
Para ser notificado sobre nuevas versiones, sigue el asset en el Asset Store, o bien mi cuenta de twitter o mi blog (twitter,
linkedin, blog).
Para información más frecuente, es preferible el hilo del foro.
Change Log
Detalles Técnicos y de Implementación
Los paquetes Burst, Mathematics and Collections son necesarios. Una lista detallada de las versiones se encuentra en el Portal de Aprendizaje.
Código de calidad, completamente documentado con su API para obtener alturas, gradientes y otra información de la superficie e interactors. Más datos estarán disponibles pronto.
Incluidas todas las fuentes C#. Código encapsulado en Assemblies y Namespaces.
Código completamente multihilo usando Jobs y Burst, con un bajo coste en CPU.
Simulación Two-way Coupling (acoplado de dos vías) : Olas afectan a los objetos y los objetos generan olas al mismo tiempo.
Las normales de la malla se actualizan en tiempo real para funcionar correctamente con la iluminación.
Posibilidad de activar el substepping para evitar inestabilidades
Arbitrary surface position and rotation, length and width. It works in local space
Un archivo detallando la resolución y los datos iniciales de cada celda se almacena y puede compartirse entre superficies.
Independiente del paso temporal (Timestep)
El tiempo de la simulación en el Fixed Update depende del tipo de interacción elegida. Puede ir desde 0.01ms hasta 4ms en el peor de los casos (muchos objetos flotando ocupando la superficie completamente). Generalmente, sin embargo, permanece entre 0.2ms y 1ms como mucho.
Soporte y Contacto
Si necesitas ayuda o estás interesado en alguna nueva característica que no está en esa lista, por favor escríbeme directamente a unitysupport (at) lidia-martinez.com