Niagara es el esperado nuevo editor para crear VFX en UE4. Con Niagara podrás programar cada aspecto de la simulación, crear nuevos módulos, organizar el efecto en un timeline e incluso añadir shaders personalizados.
¿Qué es Niagara?
Niagara es el sucesor de Cascade, editor para los sistemas de partículas y VFX en general.
Todos los conceptos en Cascade, que repasaremos a continuación, son igualmente válidos en Niagara, salvo que con éste último podrás hacer más y mejor.
Enseguida vamos a crear un primer efecto básico pero antes de eso vamos a repasar unos cuantos conceptos claves.
Conceptos claves
En Niagara los VFX se hacen usando sistemas de partículas.
Los sistemas de partículas están compuesto por emisores individuales (emitters).
En los emisores es dónde invertirás la mayor parte de tu tiempo para crear el efecto.
Cada emisor es responsable de una parte del efecto. Piensa en el efecto de una explosión. En una explosión hay un emisor para el humo, otro para el fogonazo y otro para el fuego.
Un emisor, como su propio nombre indica, emite un conjunto de partículas. Que este conjunto de partículas parezcan agua, fuego, humo o lo que fuera, es responsabilidad de los módulos.
Los módulos describen un aspecto muy concreto y simple de la partícula. Por ejemplo existen módulos para el tamaño, el color, la velocidad, aceleración, colisiones, etc.,
Existen muchos tipos de módulos y, cómo hemos dicho, cada emisor (emitter) está compuesto por una serie de módulos.
En Niagara podrás crear tus propios módulos.
En resumen, para hacer un VFX tenemos que descomponerlo en distintas partes: los emisores. Cada emisor emite un conjunto de partículas cuyas propiedades (tamaño, velocidad, color, etc.,) serán gestionados por un conjunto de módulos.
Para Niagara las partículas no son más que un conjunto de atributos. Entre ellos están la velocidad, el tamaño, el color y otros. Tal y como hemos dicho, estos atributos son inicializados y modificados por los módulos. Usando estos atributos, UE4 puede renderizar las partículas.
Activar Niagara
UPDATE: Niagara ya está activado por defecto.
Por defecto Niagara está desactivado hasta que se complete una fase de adaptación, mientras tanto se sigue usando el editor de partículas anterior, Cascade.
Para activar Niagara debes activar el plugin correspondiente en Edit > Plugins > Niagara.
Crear un primer emisor
Una vez activado Niagara, puedes crear nuevos emisores, sistemas y módulos bajo el submenú FX:
Cuando crees un nuevo emisor aparecerán una serie de módulos por defecto que podrás borrar, editar o añadir nuevos.
Ciclo de vida de un emitter
Fíjate que cuando abres un emitter:
En el editor los módulos están organizados bajo una serie epígrafes.
Estos epígrafes hacen referencia al ciclo de vida del emitter. En concreto:
Emitter Spawn
Aquí están todos los módulos que se ejecutan justo antes de que el emisor comience a emitir partículas.
Solo se ejecutan una vez.
Aquí los módulos se usan para inicializar algunos atributos globales. Por ejemplo, si la simulación se hace en local space o es conducida mediante la CPU ó GPU.
Emitter Update
Todos los módulos se ejecutan por cada frame que esté activo el emisor.
Algunos módulos importantes que deben estar ahí son los referentes a spawnear las partículas.
Particle Spawn
Los módulos solo se ejecutan una vez cuando se genera una nueva partícula.
Estos módulos definen el estado inicial de cada partícula individual.
Es el lugar perfecto para inicializar atributos como el tamaño inicial, color inicial, velocidad inicial, etc.,
Particle Update
Controla el comportamiento de cada partícula individualmente.
Estos módulos se ejecutan cada frame por cada partícula.
Aquí puedes encontrar todos los módulos encargados de gestionar el comportamiento de cada partícula a lo largo de su ciclo de vida:
- el cambio de color,
- el cambio de velocidad (aceleración),
- simulación física,
- etc.,
Es decir, modificar los atributos de cada partícula a lo largo de su ciclo de vida.
Add Event Handler
Gestiona una serie de eventos como colisiones ó eventos asociados al ciclo de vida de otros emisores.
Principalmente sirve para coordinarse con otros emisores. Por ejemplo, cuando una partícula colisione contra algo entonces que otro emisor genere un efecto de colisión.
Render
Estos módulos son especiales y se encargan de renderizar el sistema de partículas. Entre los módulos disponibles para render:
- Niagara Light Renderer – Para emitir luz.
- Niagara Mesh Renderer – Cada partícula es un mesh.
- Niagara Ribbon Renderer – Cada partícula actúa como una "cinta".
- Niagara Sprite Renderer – Cada partícula se renderiza como un quad con una textura aplicada. La mayoría de efectos están hechos con este render.
Primer efecto
En el proyecto Content Examples, disponible en la marketplace, puedes encontrar varios ejemplos de efectos hechos en Niagara. Desde ejemplos básicos a más complejos.
Vamos a replicar el primer efecto con objeto de poner en práctica lo anterior.
El efecto que vamos a replicar es el siguiente:
El plan de trabajo, visto lo anterior, es:
1. Crear nuestro primer emisor. Con uno nos bastará. Para ejemplos más complejos, necesitaremos más emisores.
2. Añadir, borrar y editar los distintos módulos del emisor para conseguir el efecto deseado.
3. Crear un sistema de partículas. Añadir el emisor a dicho sistema.
Crear un nuevo emisor
En el Content Browser, botón derecho del ratón, FX > Niagara Emitter.
Doble click para abrir el editor.
El emisor ya contiene una serie de módulos añadidos por defecto.
Velocidad
¿Por dónde empezamos? Pues lo primero es desprendernos de los módulos que, en principio, no necesitaremos.
Por ejemplo, los de aceleración, ya que en el efecto que queremos replicar no hay cambios en la velocidad.
Los efectos que cambian la velocidad lo hacen en cada frame así que deben estar bajo la etapa Particle Update.
Localiza el Acceleration Force bajo Particle Update y elimínalo.
Otras de las propiedades que queremos modificar es la velocidad inicial y la localización inicial de las partículas para ajustar al efecto que queremos conseguir.
En concreto, la velocidad debería ser solo en vertical. Localiza el módulo Add Velocity (¿dónde crees que se encontrará el módulo para inicializar el atributo de la velocidad inicial de cada partícula? Efectivamente, en Particle Spawn).
En el módulo Add Velocity la velocidad está seteada en Uniform Ranged Vector.
Esto significa que el módulo inicializa la velocidad inicial con un vector aleatorio entre el mínimo y el maximo indicados. Esto no nos vale, ya que en nuestro caso las partículas se desplazan verticalmente y siempre con el mismo valor.
Para setear a un valor fijo, pulsa sobre triangulito al lado de la velocidad y selecciona Local > Set a local value.
Escribe un valor de (0, 0, 100):
Ahora las partículas no se desvían de su camino salvo en vertical (por que su velocidad la hemos seteado en X e Y en 0).
Localización
Sin embargo, las partículas son spawneadas en distintas localizaciones iniciales cuando lo que queremos es que todas las partículas se creen en una localización (por defecto, la del emisor).
Localiza el módulo Sphere Location que es responsable de colocar las partículas inicialmente. Elimina el módulo.
Ahora todas las partículas se mueven en línea recta hacía arriba y todas empiezan en la misma localización inicial.
El siguiente paso sería reducir el número de partículas y ajustar el tamaño.
Localiza el módulo Spawn Rate bajo Emitter Update.
Cambiar el valor de SpawnRate de 100 (que son muchas partículas para el efecto que queremos conseguir) a 8.
Ahora nuestro emisor se parece mucho al efecto final que queremos conseguir.
Tamaño y Lifetime
El tamaño de las partículas no cambia a lo largo de su vida, sin embargo, sí es diferente para cada partícula.
Esto es así porque debe existir algún módulo que modifique su tamaño inicial. En efecto, puedes encontrar el módulo bajo Particle Spawn, en concreto se llama Set Variables y entre las variables que inicializa se encuentra el tamaño Particles.SpriteSize.
Del mismo modo que ocurría con la velocidad, aquí tenemos que el tamaño inicial se inicializa usando un Uniform Ranged Float, esto es, un valor aleatorio entre el mínimo y el máximo especificados.
Cambia esto e inicializa con un valor fijo de 10.
En el mismo módulo tenemos el tiempo de vida de la partícula. Si te fijas en la imagen superior, está seteada a un Uniform Ranged Float por lo que cada partícula tardará un tiempo aleatorio entre el mínimo y el máximo en desaparecer. Esto no es lo que queremos, todas las partículas deberían tener el mismo tiempo de vida.
Cambia el valor de Particles.Lifetime a un valor fijo de 3.
Niagara en acción
Hasta aquí podríamos haber usado Cascade en vez de Niagara.
Las ventajas han sido una mayor modularidad (los emisores se crean independientemente del sistema de partículas), organización (los módulos están organizados bajo las distintas fases por las que pasa el emisor) y claridad (tienes el timeline inferior para poder ver el comportamiento del emisor en cada momento).
Ya solo con esto justificaría usar Niagara frente a Cascade. Sin embargo, en lo que sigue veremos la nueva funcionalidad que nos provee Niagara.
Vamos a modificar el tamaño de las partículas a lo largo de su ciclo de vida.
Lo primero es localizar dónde tenemos el módulo. Dado que vamos a modificar un atributo (el tamaño) por cada frame, localizaremos el módulo bajo Particle Update. Sin embargo, aquí no hay ningún módulo que nos sirva. Los módulos que encontramos son:
- El módulo Update Age sirve para modificar el atributo Age de 0 al tiempo de vida de la partícula.
- El módulo Color para modificar el color. En concreto aquí está modificando el alpha, por eso ese fade out al final del ciclo de vida de la partícula. Prueba a modificar el módulo para que también haga fade in.
Tenemos que añadir un nuevo módulo para modificar el tamaño. Pulsa sobre el símbolo +. Añade el módulo Sprite Size Scale bajo el menú Size.
El módulo te pide dos valores: uno para la escala en X y otro para la escala en Y. Por defecto es (1, 1).
Como vamos a escalar uniformemente (esto es, mismo valor para X e Y), pulsa sobre el triangulito y selecciona Vector 2DFrom Float.
Como su propio nombre indica, Vector 2DFrom Float toma un float y lo convierte en un Vector2D.
Ahora tomamos el valor de Vector 2DFrom Float y en vez de usar un número constante, vamos a usar la función seno.
Pulsa sobre el triangulito a la derecha del valor de Vector 2DFrom Float y bajo Dynamic Inputs selecciona Sine.
Tal y como viene seteado por defecto la función seno no nos es muy útil:
Ya que el valor de entrada (Normalized Angle que va de 0 a 1) es 0. Y el seno de 0 es 0. Nosotros queremos que este valor esté asociado al tiempo de vida de la partícula.
Y con Niagara podemos asociar como entrada de cualquier módulo cualquier atributo de la partícula. En concreto, el atributo del que estamos interesados es el Normalized Age.
¿Recuerdas el módulo que comentamos antes, Update Age? Este módulo actualizada el atributo Age de cada partícula.
El atributo Age es el tiempo trancurrido desde que se creó la partícula. El atributo Normalized Age es el tiempo transcurrido normalizado, esto es, 0 cuando se crea y 1 cuando se destruya.
Pulsa sobre el triangulito de Normalized Angle y selecciona el atributo Normalized Age.
Y con esto ya tenemos listo nuestro efecto final.
Siguientes pasos
Ahora tienes todos los conocimientos necesarios para comenzar a estudiar Niagara a fondo.
Mi recomendación es hacer los how-to de la documentación oficial:
Link a los how-to de la documentación oficial.
Y estudiar los ejemplos del proyecto Content Examples. Los últimos ejemplos son bastante complejos.