Coating Objects with Gold
Introduction
Recouvrir un objet d’une fine couche d’or avec une simulation FLIP n’est pas ideal.
Premierement, FLIP est tres chronophage, il vaut donc la peine d’envisager des alternatives chaque fois que possible.
Deuxiemement, les simulations FLIP generent generalement des meshes adaptes au rendu de liquides :
- Des caracteristiques de tension de surface qui creent des formes arrondies, semblables a des gouttelettes
- Une topologie changeant rapidement qui s’adapte au comportement fluide et aux eclaboussures
Pour les surfaces metalliques dorees, nous avons besoin de qualites de mesh differentes :
- Une continuite de surface extremement lisse pour des reflexions speculaires correctes
- Une topologie propre qui supporte le shading de materiau metallique sans artefacts
C’est pourquoi j’ai developpe la technique decrite ci-dessous pour obtenir une geometrie plus propre, mieux adaptee aux surfaces dorees.
Concept
Diffuser un groupe sur un scatter tres dense du mesh que vous voulez recouvrir d’or, puis remesher le resultat.
Execution
1. Diffuser un groupe
a. Pyro Source Spread
Pyro Source Spread est une methode pour diffuser un groupe sur un mesh scattere, simulant la propagation d’un fluide ou d’une substance. Elle offre plusieurs avantages et inconvenients :
Avantages :
- Pas besoin de guider la diffusion.
- Nous obtenons un attribut pratique sous forme de @totalburn.
- Injection facile d’un comportement bruite pour une progression plus realiste de l’ecoulement.
Inconvenients :
- C’est un setup de simulation.
- Obtenir des formes d’ecoulement attrayantes est difficile.
- La diffusion ne correspond pas au mouvement attendu. Par exemple, elle peut remonter le long des poutres alors que la gravite devrait l’en empecher.
Les inconvenients l’ont finalement emporte sur les avantages, ce qui m’a conduit a adopter une approche differente. J’ai fini par utiliser Pyro Source Spread (PSS) pour seulement une petite partie de l’effet.
b. Noise spread
J’ai envisage d’utiliser cette technique, qui est un vrai classique, mais elle ne correspondait pas vraiment a mes besoins. Je pense qu’il vaut quand meme la peine de la mentionner juste pour partager ce tutoriel incontournable.
c. Snake system
L’idee derriere le “snake system” est assez simple. Apres avoir dessine des courbes correspondant au flux de la geometrie de la tour, je ferais grandir mon groupe en utilisant path deform sur des tubes dont les extremites etaient deformees en montagne, produisant l’aspect d’ecoulement.
Astuces path deform :
J’ai appris quelques choses sur path deform et l’attribut distance en faisant cela :
- Vous pouvez facilement mesurer la longueur d’une courbe avec le node distance along curves -> Retourne @dist
- Maintenant vous pouvez utiliser @dist dans path deform pour que le tube suive la courbe.
Attribut Offset Position :
Dans l’ecran precedent, vous pouvez voir que j’ai cree un attribut nomme @carveval pour guider mon tube le long des courbes.
Pour creer une variation dans le rythme auquel chaque serpent descend, j’ai ajoute un wrangle qui cree une plage d’animation aleatoire pour chaque courbe :
int fstart = chi('FSTART');
int fend = chi('FEND');
float floor, ceil, randFloor, randCeil, seedFloor, seedCeil, floorOffset, ceilOffset;
seedFloor = chf('Seed_Floor');
seedCeil = chf('Seed_Ceil');
ceilOffset = chf('Ceil_Offset');
floorOffset = chf('floor_Offset');
randFloor = rand(@id + seedFloor);
randFloor = - fit01(randFloor, 0, floorOffset);
randCeil = rand(@id + seedCeil);
randCeil = 1 + fit01(randCeil, 0, ceilOffset);
f@carveval = fit(@Frame, fstart, fend, randFloor, randCeil) - chf('offset_path_end');
Cela cree des animations qui commencent et se terminent a des moments differents tout en maintenant un mouvement lineaire.
Pour ajouter un mouvement non lineaire, vous pouvez utiliser un solver avec un point VOP pour manipuler l’attribut @Frame (c’est plus facile a comprendre dans le hipfile joint).
Poutres horizontales :
Pour cette partie, la technique des courbes etait trop fastidieuse a implementer, j’ai donc complete l’effet avec la technique PSS. J’ai utilise les points des poutres horizontales qui seraient inclus dans le groupe snake comme declencheurs pour la simulation PSS. J’ai appris que pour animer le sourcing PSS, il faut utiliser l’attribut @ignite.
Voir : How to animate Pyro Source Spread sourcing?
toMesh :
Maintenant notre groupe appele toMesh s’ecoule le long de la tour de maniere fluide, et nous pouvons envoyer ces points au SOP particle fluid surface.
2. Gonfler le front d’ecoulement
Afin de produire le gonflement typique des gouttes de fluide, nous utiliserons l’attribut @pscale. Nous devons augmenter la valeur pscale sur les points qui viennent d’entrer dans le mesh. A mesure que les points vieillissent dans le mesh, le multiplicateur pscale doit egalement diminuer.
a. Pyro Source Spread
Avec le setup Pyro Source Spread, nous avons deja un attribut qui nous indique depuis combien de temps un point brule : @totalburn.
Avant de modifier les valeurs pscale sur nos points, nous pouvons supprimer les points qui ne seront pas remeshes : @totalburn < 1.
L’effet ne doit etre applique que pendant les premieres secondes apres que les points entrent dans le mesh, nous pouvons donc simplement clamper les valeurs superieures.
@pscale = chf('particle_separation');
float rangemax = chf('fx_range');
f@range = fit(@totalburn, 0, rangemax, 0, 1);
float front = chramp('remap_pscale', @range);
@pscale *= front;
Nos points sont prets pour Particle Fluid Surface.
b. Noise spread & Snake system
Pour ces 2 setups nous n’avons pas @totalburn, mais il existe une solution alternative. Nous mettons nos points dans un groupe toMesh. Grace a un solver, nous pouvons mesurer depuis combien de temps les points sont dans ce groupe.
Voir : Age in a Group
Contrairement a @totalburn, cette approche conduira a un certain stepping, car notre compteur produit des valeurs discretes. Avant d’appliquer notre Front Bump Wrangle aux points, nous devons convertir @count en float puis appliquer un attribute blur.
@pscale = chf('particle_separation');
float rangemax = chf('fx_range');
f@range = fit(@count, 0, rangemax, 0, 1);
float front = chramp('remap_pscale', @range);
@pscale *= front;
3. Remesher avec Particle Fluid Surface
Lors du remeshing de nos points, reglez le parametre adaptivity a 0. C’est crucial pour obtenir une surface super lisse et un shading d’or correct. C’est le seul moyen de creer un beau mesh sans artefacts de flickering.
Conclusion
Cette technique offre une approche simple pour recouvrir des objets d’un effet de fluide dore. Bien que demonstree sur une structure de tour, ces principes fondamentaux sont suffisamment polyvalents pour s’appliquer a divers objets et scenarios.
Grace a un controle soigneux des attributs de particules et des parametres de remeshing, nous pouvons obtenir des resultats lisses adaptes au shading d’or.