Retour au Blog

Shape Fireworks with Vex

ParticlesVex Technique

Introduction

Cette technique explore une approche pour sculpter des feux d’artifice en utilisant VEX dans Houdini. En combinant la simulation de particules avec des modifications post-simulation, nous pouvons ajuster divers attributs de particules pour creer des effets de feux d’artifice qui visent a ressembler aux spectacles reels.

Wrangle 01: Couleur et Scintillements

Les particules de feux d’artifice presentent de legeres variations en taille et en intensite lumineuse. Pour imiter cela, nous pouvons assigner une valeur de luminance aleatoire a chaque particule basee sur son ID. Les feux d’artifice sont egalement caracteristiquement scintillants. Pour obtenir cet effet, nous randomisons la valeur de luminance dans le temps. Cependant, cet effet doit etre progressif car les scintillements apparaissent generalement tard dans la vie du feu d’artifice. Par consequent, nous utilisons une valeur seuil pour introduire progressivement ce comportement.

Ensuite, le contraste est renforce pour creer un effet de clignotement on/off, et cette valeur est assignee a l’attribut Alpha. Enfin, nous appliquons un degrade de couleur sur la vie de la particule, passant generalement de valeurs de luminance elevees a basses.

float randC, randT, randS, thresh;

randC = rand(@id + chf('color_seed'));
//assign random luma based on id
randT = rand(@id + chf('color_seed') + @Frame);
//assign random luma based on id + time = sparkles
randS = rand(@id + chf('selection_seed'));
//new random value for sparkles behavior aquisition
thresh = chf('sparkliness');
//dial in sparkles over time with this slider


@Cd = randC;
if (thresh > randS) @Cd = randT;
//sparkly behavior assignation

@Cd = clamp(chramp('add_contrast', float(@Cd)), 0, 1);

f@Alpha = float(@Cd);

f@agen = @age/@life;
@Cd = vector(chramp('grade_fireworks', @agen));

Wrangle 02: Obtenir la plage d’age

Pour sculpter chaque trainee avec une tete plus lumineuse, nous augmenterons la taille des particules a l’avant. Cela necessite de determiner la plage d’age des particules, car la tete est constituee des plus anciennes. Nous stockerons l’attribut age dans un array en utilisant un detail wrangle, puisque cette operation ne doit etre effectuee qu’une seule fois.

float ages[];
for (int i = 0; i < @numpt; i++)
{
    float age = point(0, "age", i);
    append(ages, age);
}

f[]@ages = ages;

f@min = min(ages);
f@max = max(ages);

Wrangle 03: Redimensionner les Particules

Ce wrangle est responsable de l’ajustement de la taille et de l’apparence des particules individuelles :

  • Il introduit une variation de taille parmi les particules en utilisant un facteur aleatoire.
  • Il ajuste la taille des particules au cours de leur duree de vie.
  • Il cree un effet de “bosse” a la tete de la trainee, rendant l’avant de chaque trainee plus grand et plus proeminant.
  • Il applique un multiplicateur de taille global pour un ajustement facile de la taille generale.

Ces effets se combinent pour creer des trainees de feux d’artifice plus realistes et visuellement interessantes, avec des tetes plus grandes et plus lumineuses qui s’effacent vers la queue.

float rand_size = rand(@id);
rand_size = chramp('randomize_size', rand_size);
@pscale = rand_size;

@pscale *= chramp('size_over_life', @agen);

f@relAge = fit(@age, @min, @max, 0, 1);
float bump = chramp('bump_trail_head', @relAge);
@pscale *= bump;

float pscale_global_mult = chf('pscale_global_multiplier');
@pscale *= pscale_global_mult;

Pour des resultats plus realistes, la valeur de la bosse a la tete de la trainee devrait etre animee au cours de la vie du feu d’artifice.

Wrangle 04: Couper par trail id

Ce wrangle se concentre sur la creation de variation dans la longueur des trainees :

  • Il utilise le trail ID pour generer un facteur aleatoire pour chaque trainee. Ce facteur est utilise pour ajuster l’age apparent des particules dans la trainee.
  • Les particules qui depassent un certain seuil d’age sont supprimees.

Le resultat est que differentes trainees dans le feu d’artifice auront des longueurs variables, ajoutant de la complexite et du hasard naturel a la forme globale du feu d’artifice. Cela aide a eviter un aspect uniforme et artificiel, rendant le spectacle de feux d’artifice plus dynamique et realiste.

Ensemble, ces wrangles contribuent significativement a l’apparence organique et variee du feu d’artifice, creant un effet plus convaincant et visuellement attrayant.

f@old = fit01(rand(@trail_id), chf('trim_low_random_values'), chf('trim_high_random_values'));
@agen /= @old;

if (@agen>1) removepoint(0, @ptnum);

Conclusion

Les wrangles VEX decrits ici representent une facon d’ameliorer une simulation de particules basique pour creer des effets de feux d’artifice plus detailles. Chaque wrangle se concentre sur un aspect specifique de l’apparence du feu d’artifice, de la couleur et des effets de scintillement a la mise en forme des trainees et la variation de longueur.

Cette approche a ete utile dans mon travail de production, mais il est important de se rappeler que les besoins de chaque plan peuvent varier considerablement. La flexibilite de Houdini permet de nombreuses techniques differentes, et j’encourage l’exploration pour trouver la methode qui convient le mieux aux exigences specifiques de votre projet.