La versión alfa de Away3D 4.1 incluye soporte para la creación de sistemas de partículas de alto rendimiento basados en GPU con un API poderoso y configurable. Se puede usar esta habilidad para implementar efectos increíbles en tus proyectos 3D.

Logo Away3D

Este tutorial introduce las bases del API, incluyendo la clase de partículas geométricas y la función de inicialización de la animación para controlar la vida y comportamiento de las partículas.

Partículas Geométricas

Lo primero que se necesita para las partículas, es un conjunto de geometría. Cada elemento es un conjunto que representara un tipo de partícula. Se puede usar cualquier figura geométrica, incluyendo figuras geométricas primitivas proporcionadas por Away3D o figuras geométricas cargadas desde un archivo externo. Sin embargo, no se recomiendan las figuras con muchos vértices, ya que afectaran el rendimiento de la animación.

Puedes estar preguntándote porque las figuras están predefinidas en lugar de ser creadas al vuelo como otros sistemas de partículas. Esto es debido a las limitaciones impuestas al búfer de carga de vértices, en el cual si se agregan las figuras de las partículas de forma dinámica, necesitara ocurrir mucho más frecuentemente. Cargar un búfer de vértices conlleva a un costo de rendimiento, así que es una buena idea el reducir dichas cargas si es posible. Además, las figuras geométricas dinámicas tienen restricciones al compartir el búfer de vértices a través de diferentes instancias de la animación.

La demostración incluye archivos de ejemplo (que puedes descargar aquí) para este tutorial que usan CubeGeometry como el conjunto de elementos geométricos. Puedes encontrar este código de ejemplo en el archivo TheBasicTutorial.as:

El código anterior agrega 1000 cubos al conjunto geométrico. Si se requiere, se pueden mezclar diferentes tipos de figuras geométricas en el mismo conjunto geométrico.

Una vez que el conjunto está listo, se puede usar el API para convertir el conjunto en la partícula geométrica final.

Ahora se tiene la instancia final de la partícula geométrica, lista para su animación.

Tiempo de vida de la Partícula

El siguiente paso es crear un conjunto de partículas de animación. Puede que ya estés familiarizado con el concepto del ciclo de vida del tiempo de vida de las partículas. En un sistema de partículas tradicional, una partícula tiene un tiempo de vida definido, a través del cual otras propiedades (color, posición, etc.) son controladas.

En Away3D, una partícula tiene una propiedad startFrame relacionada al tiempo del sistema, y una propiedad opcional de duración. (Si no se especifica la duración, entonces la partícula tendrá una duración infinita). La propiedad de retraso (también opcional) representa el tiempo de retraso entre el fin de la duración de una partícula y el inicio de la duración de otra. Cuando se usan estas propiedades, una partícula aparecerá en su tiempo de inicio, se mantendrá “viva” durante su tiempo de duración, y entonces desaparecerá en su tiempo de retraso.

Debido a que estas propiedades son fundamentales para los cálculos de tiempo dentro del código del GPU, se tiene que predefinir cuales serán utilizadas. El primer parámetro del constructor ParticleAnimationSet indica si se estarán utilizando la propiedad duration de la partícula. El segundo parámetro indica si se usara una línea de tiempo cíclica (de modo que una vez una partícula ha completado su ciclo, automáticamente lo comenzara una nueva). EL tercero indica si las partículas desaparecerán en el tiempo de retraso antes del reinicio de sus ciclos.

En este ejemplo, las tres propiedades han sido establecidas en true:

Es importante notar que no hay propiedades en el conjunto de animación. Si las hubiera, todas las partículas tendrían las mismas propiedades y aparecerían y desaparecerían al mismo tiempo. En vez de ello, se usa una función que establece cada propiedad en las partículas de manera separada. debido a que son locales para cada partícula y se establecen una sola vez, startTime, duration, y delay son conocidas como propiedades estáticas locales. La función que establece estas propiedades será invocada para cada partícula. Se puede identificar el índice de la partícula usando el valor ParticleProperties::index, y entonces se establecen los valores ParticleProperties::startTime, ParticleProperties::duration y ParticleProperties::delay para la partícula, por ejemplo:

El código anterior crear un conjunto de propiedades estáticas locales que harán que las partículas inicien su ciclo cada 5 milisegundos de diferencia, las mantendrá “vivas” por 10 segundos, y entonces las enviara a “dormir” por 5 segundos.

Posición de la Partícula

Otros sistemas de partículas tienen un emisor que se usa para controlar la posición de origen de cada partícula. El sistema de partículas de Away3D implementa la misma funcionalidad de una forma más efectiva a través de comportamientos (uno de los conceptos más importantes en el API de partículas).

La clase ParticlePositionNode puede controlar la posición para cada partícula en la instancia de ParticleGeometry. La naturaleza de su control está determinada a través de una propiedad en constructor de la clase. Esto toma tres valores diferentes:

  • ParticlePropertiesMode.LOCAL_STATIC (las partículas pueden tener diferentes propiedades iniciales para el comportamiento).
  • ParticlePropertiesMode.GLOBAL (todas las partículas tienen las mismas propiedades iniciales).
  • ParticlePropertiesMode.LOCAL_DYNAMIC (las partículas pueden tener diferentes propiedades que son controladas al vuelo).

Los modos LOCAL_STATIC y GLOBAL pueden compartir recursos de GPU a través de instancias de la animación, resultando en alto rendimiento. Así que, es una buena idea usar estos dos modos tanto como sea posible.

Este ejemplo usa ParticlePropertiesMode.LOCAL_STATIC:

Esto controla el valor de posición a través de la función initParticleFunc:

Antes de poder visualizar el efecto, se tiene que crear el material, mesh, y el objeto animador para las partículas. Esto toma el mismo enfoque que otras formas de animar en Away3D.

Particulas con Away3D

(click en la imagen para lanzar ejemplo)

Velocidad de la Partícula

Ahora ya se está listo para hacer que las partículas se muevan. Para esto, se necesitara utilizar otro comportamiento, el ParticleVelocityNode, el cual es un nodo de la animación de la partícula usado para establecer la velocidad inicial de la partícula.

Ya sabes que se debería estar usando ambos modos LOCAL_STATIC o GLOBAL tanto como sea posible. Pero, ¿cuál es mejor para esta aplicación? Internamente, el modo LOCAL_STATIC usa una corriente de registros para pasar los datos al GPU, de modo que los datos pueden ser representados por partícula. Sin embargo, GLOBAL usa registros constantes para pasar los datos por comportamiento. El número de corrientes de registros disponibles es más bajo que el número de registros constantes, y las corrientes de registros requieren más datos y más tiempo de inicialización. Así que como regla, deberías optar por el modo GLOBAL cuando sea posible.

En este caso, el objetivo es tener todas las partículas moviéndose con la misma velocidad, así que se puede usar el modo ParticlePropertiesMode.GLOBAL:

Así luce el resultado:

Particulas con Away3D

(click en la imagen para lanzar ejemplo)

A dónde ir desde aquí

Has visto como crear una partícula geométrica, como establecer el tiempo de inicio y las propiedades de posición en partículas individuales, y cómo hacer que se muevan. Por supuesto, el API tiene muchas más características que las que se cubrieron aquí, pero ahora tienes un buen punto de partida desde el cual se pueden crear efectos impresionantes! Solo como un ejemplo, puedes crear el siguiente efecto usando las únicas características descritas en este tutorial:

Ejemplo

(click en la imagen para lanzar ejemplo)

Aquí hay algunos recursos que puedes usar para continuar aprendiendo acerca de Away3dD:

Recuerda que en Activ tenemos un curso de ActionScript que te ayudará a sacarle más aprovecho a Away3D

La versión original de este artículo está publicada en Adobe Devnet bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por Jesús Macedo.