[Tutoriel] Créer de la mousse

Les scripts sous RealFlow, si pratiquent, mais pas forcement simples
Tous réunis ici !

[Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 31 Mars 2008, 21:58

Bonjour,

Pour lancer les tutoriaux, voici un petit script pour gérer la création de la mousse :
Code : Tout sélectionner
from random import randint
def onSimulationStep():
   liquid = scene.getEmitter("champ")
   foam = scene.getEmitter("mousse")
   particles = liquid.getParticlesColliding()
   for particle in particles:
      pos = particle.getPosition()
      vel = particle.getVelocity()
      if particle.getVelocity().module() > 6:
         foam.addParticle(pos, vel)
         liquid.removeParticle(particle.getId())
   fparticles =foam.getParticles()
   for fparticle in fparticles:
      fpos = fparticle.getPosition()
      fvel = fparticle.getVelocity()
      fnor =fparticle.getNormal()
      if fparticle.getAge() > (15 + randint(0,15)) and fnor.getY() < 0:
         liquid.addParticle(fpos, fvel)
         foam.removeParticle(fparticle.getId())

Tout d'abord il faut créer 2 emitter, le premier nommé champ et le second nommé mousse.
On initialise nos deux variables qui contiennent les particules des deux emitters :
Code : Tout sélectionner
liquid = scene.getEmitter("champ")
   foam = scene.getEmitter("mousse")

Le but est que le "champ"(le "liquid") se transforme en "mousse" ("foam") lorsqu'il entre en collision avec quelque chose. Ce script s'exécute à chaque Step (def onSimulationStep():). Il récupère les particules qui sont rentrées en collision lors de ce Step
Code : Tout sélectionner
particles = liquid.getParticlesColliding()
   for particle in particles:

Il enregistre donc ces particules dans "particules" et vérifie pour chacune sa vitesse. Si cette dernière est supérieure à 6 il rajoute une particule dans "foam" en y ajoutant la position et la vitesse de la particule entrée en collision puis la supprime de "liquid".

Et voila! à partir de ce moment notre champagne s'est transformé en mousse :)

Mais bon, si je montre ça à Roch (de MaxwellRender.fr) il me dévisage en me disant :
Roch a écrit:Bien gentil tout ça, mais la mousse, au bout d'un moment, ça redevient du champagne, t'es nul !

:( J'essuie mes larmes et je continues. La mousse redevient du champagne lorsque sa durée de vie a passé un certain temps (en l'occurrence 15 Step plus ou moins 15) et que sa normal soit en dessous des 0 sur l'axe des y (qu'elle retombe en fait). Le code teste cela à chaque Step et si la particule de "foam" réussi aux tests, elle redevient "champ".
Code : Tout sélectionner
for fparticle in fparticles:
      fpos = fparticle.getPosition()
      fvel = fparticle.getVelocity()
      fnor =fparticle.getNormal()
      if fparticle.getAge() > (15 + randint(0,15)) and fnor.getY() < 0:
         liquid.addParticle(fpos, fvel)
         foam.removeParticle(fparticle.getId())

Et voila, le cycle complet de notre beau champagne.
Voyons ce que ça donne :
Image
Roch a écrit:Il ne reste plus qu'à deguster :lol:
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Re: [Tutoriel] Créer de la mousse

Messagepar valou » 12 Avr 2008, 13:24

Félicitations pour ce tutoriel qui tombe vraiment a pic.

Juste une question, je tente d'appliquer ce tutoriel sur une scène avec beaucoup plus de particules, pour créer une vague géante sur laquelle j'aimerais rajouter de l'écume. Mais la le script ralentit considérablement le temps de calcul, voire fait planter realflow (8 frames calculées en une nuit). Du coup j'aurais aimé optimiser ce script mais la documentation scripting de realflow n'est pas très fournie.

Cela te parait t'il normal que ce script puisse autant ralentir un rendu (étant donné qu'il s'agit d'une simple operation de contrôle d'attributs sur chacune des particules) ?
J'ai remarqué que le gestionnaire d'événement onSimulationStep() se lance plusieurs fois lors de chaque calcul de frame, ne serai-ce pas plus rapide d'utiliser onSimulationFrame() a la place ?
Ne serait-ce pas certaines fonctions utilisées qui demandent un temps de calcul exponentiel selon le nombre de particules dans la scène ( comme getParticlesColliding()) ?

Si quelqu'un a quelques indices qui pourrait m'aider à avancer avec ce script. Ou un lien vers une documentation de script plus fournie que l'aide realflow...

Pour info ma scène comporte actuellement 640000 particules, et le temps de calcul prend habituellement moins d'une dizaine d'heures.

Merci d'avance
valou
 
Message(s) : 2
Inscrit le : 12 Avr 2008, 12:57

Re: [Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 12 Avr 2008, 17:57

Salut valou et bienvenue à toi !

8 frames en une nuit... :shock:
Que le script ralentisse oui, vu ton nombre de particule, il doit les passer une à une pour détecter les collisions puis encore les passer une à une pour le bouger d'emitter si c'est nécessaire etc... Si tu utilise le onSimultaionFrame() tu ne travaillera pas sur toute les particules mais ça peut suffire dans ton cas. Dans une seule frame il y a plusieurs step, c'est pour ça qu'il s'exécute plusieurs fois, d'ailleurs petite question, comment as tu fait pour voir qu'il se lançait plusieurs fois?

640000 particules ça va faire une belle vague !! faudra que u nous montre tout ça !;)
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Re: [Tutoriel] Créer de la mousse

Messagepar valou » 13 Avr 2008, 02:59

Ok, merci beaucoup pour la réponse.
Du coup et après avoir fait des test je vais mettre l'idée de la mousse de coté et laisser mon rendu tel quel. Pour répondre à la question, pour savoir combien de fois le script se lance, il suffit de glisser une ligne et d'ouvrir la fenetre de message pendant le rendu.
Code : Tout sélectionner
scene.message("test")
(de mémoire)

Sinon mon rendu pour l'instant ressemble a çà
Image

C'est la dernière image que maya a réussi a rendre avant de planter :cry: :cry:
Je vais continuer a optimiser tout ça pour l'intégrer a mon rendu final.
(Il s'agit d'une grosse vague de coca en fait)

D'ailleurs je rétiaire ma question a tout hasard :roll: , si quelqu'un a un lien vers une référence de script détaillée..
Dernière édition par valou le 13 Avr 2008, 03:04, édité 1 fois.
valou
 
Message(s) : 2
Inscrit le : 12 Avr 2008, 12:57

Re: [Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 13 Avr 2008, 03:04

Très sympa !
J'attend de voir la suite! Si tu veux y'a la partie WIP, ça pourrais être pas mal ;)
Merci pour l'info

edit : Tu as vraiment besoin de tant de particules?
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Re: [Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 15 Avr 2008, 11:11

J'avais pas vu la fin de ton post, tu entends par quoi "script détaillée" ? il manque quelque chose?
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Re: [Tutoriel] Créer de la mousse

Messagepar Ladislas » 16 Avr 2008, 12:09

Salut!
Merci pour ce script qui m'interesse beaucoup pour faire de la bieres.

Quant j'utilise ce script, malheuresement, ceci ne marche pas.
Pourtant j'ai mis 2 emetters comme ci dessus indiquer. Un "champ" et un "mousse".
La vitesse est superieure a 6.

Je me pose quelques questions.
Pourquoi faire 2 emetter, car sur la photo ci dessous, je vois qu'un seul emetter.

Image

Deuxieme question que je me pose:
Le nombre de steps...dans le scripts il est a a 15... mais c'est tres peu? sachant que par defaut real flow est a 333 (meme si je le baisse)

Steps est contraire a Frame ?!

Merci de ton aide,

Ladislas
-To Beyond and Infinity -
- Keep it easy -
Avatar de l’utilisateur
Ladislas
 
Message(s) : 68
Inscrit le : 09 Avr 2008, 10:50

Re: [Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 16 Avr 2008, 14:15

Salut Ladislas,

Alors, les 2 emitters sont nécessaires je m'explique : il t'en faut pour générer le "champ" il a une vitesse etc... un emitter normal qui aura ses propres propriétés de viscosité, pression etc..., puis tu as l'emitter "mousse" qui lui n'a pas de vitesse car c'est un emitter qui "n'émet" pas... il sert juste à stocker les particules de mousse et ainsi avoir les propriété de la mousse, densité etc... mais aussi ça te permet de faire 2 mesh différent ce qui est nettement plus pratique pour le texturage ;)
En gros les emitter sont des boites, l'un émet et l'autre stocke temporairement les particules qui répondent au test.

Pourquoi parles tu de 15 steps dans le code? et le 333 correspond à quoi?
Steps n'est pas contraire de frame mais différents.
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Re: [Tutoriel] Créer de la mousse

Messagepar Ladislas » 16 Avr 2008, 15:35

Merci je test ce soir en retrant a la maison
Pour les steps il est a 15 dans le script, mais 15 décomposes le nombre dans une frames.
Enfin je vais voir sa apres, et puis c'est pas important

merci
-To Beyond and Infinity -
- Keep it easy -
Avatar de l’utilisateur
Ladislas
 
Message(s) : 68
Inscrit le : 09 Avr 2008, 10:50

Re: [Tutoriel] Créer de la mousse

Messagepar verbalinsurection » 16 Avr 2008, 15:41

Heuu.... où vois tu 15 steps dans le script? pour l'age des particules? ça c'est juste un test... je vois pas...
Avatar de l’utilisateur
verbalinsurection
Administrateur du site
 
Message(s) : 1006
Inscrit le : 28 Mars 2008, 22:10
Localisation : Paris

Suivant

Retour vers Tutoriaux & Scripts

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 invité(s)

cron