Test bière/mousse 3DS Max/Vray

Les projets en cours, les tests etc ...

Re: Test bière/mousse 3DS Max/Vray

Messagepar pingu » 08 Fév 2012, 06:47

Je commence à comprendre pourquoi tu utilise 3 emitters: sinon cela peut créer une boucle sans fin à cause de l'instabilité de la simulation. Pourrais-tu partager ton script car moi, si j'essaie de transformer la mousse avec ce 3eme emitter, il y a une chose bizarre qui se produit: le fluide diminue de moitié son volume, sans raison apparente.
pingu
 
Message(s) : 409
Inscrit le : 30 Oct 2008, 13:54

Re: Test bière/mousse 3DS Max/Vray

Messagepar blax17 » 09 Fév 2012, 14:38

Salut

Voici mon foam script :
Code : Tout sélectionner
#################################################################################
#
# Name : Alternative beer foam
#
# Author : Paul PARNEIX (Blax17)
# Date : 25 december 2011
#
# description :Inspired by a existing script, Alternative beer Foam event using 3 differents emitters and a null object :
#                                 first emitter create beer, second create foam based on collision, age and velocity
#                                 and the third get back foam to beer based on age and z position of a null object
#                                 The null object is used to animate the high of the foam
#
##################################################################################




#--------------------------------------------------
# Function: onSimulationStep
#--------------------------------------------------

def onSimulationStep():

   import random

   liquid = scene.getEmitter("beer") 
   liquid2 = scene.getEmitter("beer2")
   foam = scene.getEmitter("foam")
   threshold = 10 # controls the amount of foam particles (raising value = decreasing amount)

   ageStart = 0.5
   velStart = 1.0

   age = 0.3
   velMax = 0.2

##Random  beer to foam

   particlesLiquid = liquid.getParticles()
   for partLiquid in particlesLiquid:
      pAge = partLiquid.getAge()
      pos = partLiquid.getPosition()
      vel = partLiquid.getVelocity()   
      if pAge > ageStart*(random.uniform(0.0, 50.0)) and partLiquid.getVelocity().module() > velStart*(random.uniform(1.0, 100.0)):
         foam.addParticle(pos, vel)
         liquid.removeParticle(partLiquid.getId())

## beer to foam when colliding
   particles = liquid.getParticlesColliding()
   for particle in particles:
      pAge = particle.getAge()
      pos = particle.getPosition()
      vel = particle.getVelocity()
      if particle.getVelocity().module() > threshold:
         foam.addParticle(pos, vel)
         liquid.removeParticle(particle.getId())

## Foam to beer
   particlesFoam = foam.getParticles()
   for partiFoam in particlesFoam:
      pAge = partiFoam.getAge()
      pos = partiFoam.getPosition()
      vel = partiFoam.getVelocity()
      null = scene.getObject("Null01")
      nullPos = null.getParameter("Position")
      if pos.z < nullPos.z and pAge >50*(random.uniform(0.0, 50.0)):
         liquid2.addParticle(pos, vel)
         foam.removeParticle(partiFoam.getId())         
      



#--------------------------------------------------
# Function: onSimulationFrame
#--------------------------------------------------

def onSimulationFrame():
   pass

#--------------------------------------------------
# Function: onSimulationBegin
#--------------------------------------------------

def onSimulationBegin():
   pass


#--------------------------------------------------
# Function: onSimulationEnd
#--------------------------------------------------

def onSimulationEnd():
   pass




#--------------------------------------------------
# Function: onChangeToFrame
#--------------------------------------------------

def onChangeToFrame():
   pass


J'ai modifié un script existant, le retour mousse -> biere ne se fait plus en fonction de la vélocité, chez moi ca faisait un truc bizarre (la mousse redevenait bière par le haut, effet non réaliste). Il faut animer un null object qui va représenter la séparation mousse / liquide.
http://cgfox.net Blog & Tutoriaux Vray, 3DS Max, Realflow...
Avatar de l’utilisateur
blax17
 
Message(s) : 40
Inscrit le : 14 Déc 2011, 18:42
Localisation : La Rochelle

Re: Test bière/mousse 3DS Max/Vray

Messagepar pingu » 09 Fév 2012, 17:14

merci bcp.

Je n'utiliserais pas le code qui transforme aléatoirement la bière en mousse parce qu'en réalité, est-ce qu'on voit de la mousse avant que la bière touche le verre? Moins il y a de code, mieux c'est car python est monothread.

Et je ne vois pas très bien ton problème de la mousse qui se transforme par le haut. Moi, g mis un code qui transforme aléatoirement les particules en liquide et il n'y a pas d'instabilités ni de liquide qui se retrouve sur la mousse (en tout cas, je ne les ai pas vu).

J'ai testé ton script et il n'y a pas le problème du fluide qui perd la moitié de son volume à cause d'un troisième emitter. Par contre, si je change la ligne du if, quand le foam se transforme en bière, en changeant juste le 50*(random...) par 5+(random...), le problème revient:

if pos.z < nullPos.z and pAge >50+(random.uniform(0.0, 50.0)):

Assez incroyable. Je ne comprends pas pourquoi. Bon, de toute façon, j'ai résolu le problème de boucle sans fin en rajoutant la condition de ne plus se transformer en mousse à partir de x frames et comme ça, je n'ai que 2 emitters.

Voilà, sinon, j'ai aussi réussi à avoir une simulation presque stable avec une densité de 300 pour le foam. Et je vais résoudre mon problème pour la transformation du foam en liquide en perdant du volume car la mousse est majoritairement de l'air en supprimant des particules du foam au lieu de les transformer en liquide. Et comme ça, je n'ai pas besoin de changer l'int. et ext. pressure qui complique la simulation.
Dernière édition par pingu le 10 Fév 2012, 10:58, édité 1 fois.
pingu
 
Message(s) : 409
Inscrit le : 30 Oct 2008, 13:54

Re: Test bière/mousse 3DS Max/Vray

Messagepar pingu » 09 Fév 2012, 18:37

Voilà ce que ça donne en supprimant 1 particule sur 3 de foam (dans cette vidéo, 1 sur 7 environ):

Image

le code:
Code : Tout sélectionner
for fparticle in fparticles:
      flag = flag + 1
      if fparticle.getAge() > (8 + randint(0,7000)):
         if (flag % 3 == 0):
            liquid.addParticle(fparticle.getPosition(), fparticle.getVelocity())
         foam.removeParticle(fparticle.getId())


faudrait que j'en supprime un peu moins, on ne voit pas le liquide monter.
pingu
 
Message(s) : 409
Inscrit le : 30 Oct 2008, 13:54

Re: Test bière/mousse 3DS Max/Vray

Messagepar blax17 » 10 Fév 2012, 01:13

Sympa ! ;)

Faudra que tu poste ton script final le résultat est top.

Cependant il y a un problème que j'avais aussi, la mousse "saute" en remontant, ça fait pas très réaliste mais je n'ai pas trouvé comment résoudre le problème.

Et il y a aussi des particules de liquide "piégées" dans la mousse... Pas de solution non plus.

Mais a ce rythme la on va trouver une bonne technique :D
http://cgfox.net Blog & Tutoriaux Vray, 3DS Max, Realflow...
Avatar de l’utilisateur
blax17
 
Message(s) : 40
Inscrit le : 14 Déc 2011, 18:42
Localisation : La Rochelle

Re: Test bière/mousse 3DS Max/Vray

Messagepar pingu » 10 Fév 2012, 08:20

pour la mousse qui saute, oui, g fait bcp de simulation où elle sautait sans raison valable (si ce n'est l'instabilité de la simulation). Mais là, ça ne me dérange pas, c'est juste après que le liquide soit versé et il essaie de se stabiliser. Sûrement qu'en mettant un drag force animé, l'effet serait moins visible.
Je n'ai pas encore fait de rendus, donc je ne vois pas encore les pièges auxquels je vais devoir faire face. Mais si c'est juste des particules isolées qui ne remontent pas, je peux très bien les exclurent lors de la création du mesh pour les bulles. Avec bcp de particules, ce n'est pas une particule qui va créer un grand trou dans le mesh du liquide.

Un problème que je vois pour le rendu, c'est que s'il y a bcp de particules, elles seraient trop petites pour créer une sphère autour de chacune d'entre elles. Il faudrait donc utiliser une particule sur 4 pour la création des bulles. Et je me demande comment bien répartir ces 1/4 particules.

Mon script est tout simple (et souvent le plus simple est le mieux). Tu vois déjà la moitié dans le code que j'ai posté en haut. J'ai rajouté du code qui permet de ne pas créer bcp de particules sur une seule image (à cause de l'instabilité). Tu transformes ça en language informatique et tu as mon code!
pingu
 
Message(s) : 409
Inscrit le : 30 Oct 2008, 13:54

Re: Test bière/mousse 3DS Max/Vray

Messagepar pingu » 11 Fév 2012, 12:02

Par rapport aux 3 fluides qui se simulent en relation l'un avec l'autre. J'en suis arrivé à la conclusion qu'il y a un bug dans realflow 2012 qui ne permet pas de simuler plus de 2 fluides en relation. Et en changeant une ligne de code, j'ai simplement changé les relations des fluides entre eux:

liquid1 = le liquide de départ
foam = la mousse
liquid2 = le liquide transformé de mousse à liquide

Si un liquide ne peut être lié qu'à un seul autre liquide. Alors si liquid1 est lié avec foam, foam est lié avec liquid1 et liquid2 est lié avec liquid1. Si le liquid2 a peu de particules, difficile de voir le bug (qu'il n'est pas lié avec foam). Tandis que si liquid2 est lié avec foam au lieu de liquid1, le bug apparaît directement car tout le liquid2 sera en bas, ne prenant pas en compte les particules de liquid1.
pingu
 
Message(s) : 409
Inscrit le : 30 Oct 2008, 13:54

Précédent

Retour vers WIP

Qui est en ligne ?

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

cron