Dorian Fevrier's blog - Mot-clé - instancerJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearPetit script Maya pour utiliser les objectID par particuleurn:md5:038be63299b2d2f7a738f3dd424e097f2011-07-17T21:50:00+02:002013-07-26T18:07:35+02:00NarannScript et codealéatoirefridinstancermayaparticulescript<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid_tn.png" alt="code_particle_objectid_tn.png" style="float:left; margin: 0 1em 1em 0;" title="code_particle_objectid_tn.png, juil. 2011" height="150" width="150" />Et encore un billet express car je fais rarement des particules et j'en avais assez de devoir chercher, à chaque fois, comment créer un système de particule qui instancie des objets aléatoirement.</p>
<p>Je me suis donc fait un bout de code à lancer que je partage avec vous en espérant qu'il fera gagner du temps à certains. :hehe:</p>
<p>Enjoy!</p> <h3>Le script</h3>
<p>C'est assez basique mais ça évite bien des clics. :sourit:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: #dc143c;">cmds</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">cmds</span>
<span style="color: #808080; font-style: italic;"># get the selected nodes</span>
selectionList = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">ls</span><span style="color: black;">(</span> selection=<span style="color: #008000;">True</span> <span style="color: black;">)</span>
nodeList = selectionList<span style="color: black;">[</span>:<span style="color: #008000;">len</span><span style="color: black;">(</span>selectionList<span style="color: black;">)</span>-<span style="color: #ff4500;">1</span> <span style="color: black;">]</span> <span style="color: #808080; font-style: italic;"># get all nodes except the last one</span>
myPlane = selectionList<span style="color: black;">[</span> <span style="color: #008000;">len</span><span style="color: black;">(</span>selectionList<span style="color: black;">)</span>-<span style="color: #ff4500;">1</span> <span style="color: black;">]</span> <span style="color: #808080; font-style: italic;"># get the last node wich should be the plane you want to spread particle on</span>
<span style="color: #808080; font-style: italic;"># create the particle system</span>
myEmitter = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">emitter</span><span style="color: black;">(</span> myPlane, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"surface"</span>, speed=<span style="color: #ff4500;">0</span> <span style="color: black;">)</span><span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>
myParticleSys = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">particle</span><span style="color: black;">(</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># [u'particle1', u'particleShape1']</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">connectDynamic</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">0</span><span style="color: black;">]</span>, emitters=myEmitter <span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># connect the emitter to the particle system</span>
myInstancer = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">particleInstancer</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, addObject=<span style="color: #008000;">True</span>, <span style="color: #008000;">object</span>=nodeList <span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># create instancer from all the selected objects</span>
<span style="color: #808080; font-style: italic;"># add per particle attributes</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">addAttr</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, ln=<span style="color: #483d8b;">"randIndexPP"</span>, dt=<span style="color: #483d8b;">"doubleArray"</span> <span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">addAttr</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, ln=<span style="color: #483d8b;">"rotPP"</span>, dt=<span style="color: #483d8b;">"vectorArray"</span> <span style="color: black;">)</span>
<span style="color: #808080; font-style: italic;"># tell the particle system to use attribut "randIndexPP" for objectIndex and "rotPP" for rotation</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">particleInstancer</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, edit=<span style="color: #008000;">True</span>, name=myInstancer, objectIndex=<span style="color: #483d8b;">"randIndexPP"</span> <span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">particleInstancer</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, edit=<span style="color: #008000;">True</span>, name=myInstancer, rotation=<span style="color: #483d8b;">"rotPP"</span> <span style="color: black;">)</span>
<span style="color: #808080; font-style: italic;"># prepare and create the expression</span>
expressionStr = <span style="color: #483d8b;">"%s.randIndexPP = rand(0,%s.9999999);<span style="color: #000099; font-weight: bold;">\n</span>"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, <span style="color: #008000;">len</span><span style="color: black;">(</span>selectionList<span style="color: black;">)</span>-<span style="color: #ff4500;">2</span><span style="color: black;">)</span>
expressionStr += <span style="color: #483d8b;">"particleShape1.rotPP = << rand(-15, 15), rand(-15, 15), rand(-15, 15) >>;"</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">dynExpression</span><span style="color: black;">(</span> myParticleSys<span style="color: black;">[</span><span style="color: #ff4500;">1</span><span style="color: black;">]</span>, creation=<span style="color: #008000;">True</span>, <span style="color: #dc143c;">string</span>=expressionStr <span style="color: black;">)</span></pre>
<h3>Exemple</h3>
<p>Je n'allais tout de même pas balancer le truc sans que vous ayez au moins un aperçu de ce que ça donne en pratique! :hehe:</p>
<p>Voici trois brins d'herbe différents:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid002.png" alt="code_particle_objectid" style="display:block; margin:0 auto;" title="code_particle_objectid002.png, juil. 2011" height="436" width="252" /></p>
<center><i>Avec points de pivot bien placés et freeze transformés évidement! :redface:</i></center>
<p>Sélectionnez les:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid003.png" alt="code_particle_objectid003.png" style="display:block; margin:0 auto;" title="code_particle_objectid003.png, juil. 2011" height="135" width="311" /></p>
<p>Puis sélectionnez le plan sur lequel vous souhaitez que les particules soit placées:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid004.png" alt="code_particle_objectid004.png" style="display:block; margin:0 auto;" title="code_particle_objectid004.png, juil. 2011" height="136" width="307" /></p>
<p>Lancez le script! :grenadelauncher:</p>
<p>Avancez de quelques images:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid005.png" alt="code_particle_objectid005.png" style="display:block; margin:0 auto;" title="code_particle_objectid005.png, juil. 2011" height="94" width="256" /></p>
<p>Et voyez le résultat:</p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/code_particle_objectid006.png" title="code_particle_objectid006.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_17_code_particle_objectid/.code_particle_objectid006_m.jpg" alt="code_particle_objectid006.png" style="display:block; margin:0 auto;" title="code_particle_objectid006.png, juil. 2011" height="361" width="560" /></a></p>
<p>Bon, c'est vrai qu'avec des brins d'herbe ça ne saute pas aux yeux mais essayez avec des formes plus claires et vous verrez de suite les objets que vous avez sélectionné placés de manière aléatoire. :sauteJoie:</p>
<h3>Conclusion</h3>
<p>En espérant que ce micro-billet-express vous servira.</p>
<p>A bientôt!</p>
<p>Dorian</p>Orienter les particules sur la normale d'un mesh ou d'une surface: closestPointOnMeshurn:md5:190e37d74be06c95383bbb73607a86d32010-09-13T22:20:00+02:002013-07-26T18:13:26+02:00NarannInfographie 3D - BoulotclosestPointOnMeshfrinstancermayameshnodenormalparticule<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_tn.png" alt="oriente_particle_maya_tn.png" style="float:left; margin: 0 1em 1em 0;" title="oriente_particle_maya_tn.png, sept. 2010" height="150" width="150" />Lors de mes recherches sur les particules, j'étais face à un problème qu'on rencontre assez fréquemment:</p>
<p>Orienter des instancers en fonction de la normale du mesh sur lequel elles se trouvent... :casseTeteMur:</p>
<p>Ça semble être un bête problème mais dans Maya, ce n'est pas si évident et il faut un peut bidouiller pour pouvoir le faire.</p>
<p>Je vous propose à travers ce tuto une petite solution qui, vous allez voir, n'est pas de moi mais que je ne pouvais m'empêcher de vous faire partager.</p> <p>Une des méthodes rapides pour faire ça est de mettre une vitesse très très faible (0.001) aux particules et d'orienter la particule en fonction de sa vitesse. Franchement, ça dépanne mais ça peut poser quelques soucis plus tard....</p>
<center>:longBar:</center>
<h5>Contexte</h5>
<p>Je suis tombé sur un <a href="http://forums.cgsociety.org/showthread.php?t=789536" hreflang="en">thread CGTalk</a> d'une personne demandant justement, comment procéder.</p>
<p>La meilleur réponse fut sans conteste <a href="http://forums.cgsociety.org/showpost.php?p=6006153&postcount=4" hreflang="en">celle de YouDaftPunk</a> qui parle d'un node qui permet de faire ça: "closestPointOnMesh" :sourit:</p>
<p><a href="http://forums.cgsociety.org/showpost.php?p=6006153&postcount=4" hreflang="en"><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya001.png" alt="oriente_particle_maya001.png" style="display:block; margin:0 auto;" title="oriente_particle_maya001.png, sept. 2010" height="357" width="482" /></a></p>
<p>Il donne également une scène assez complète pour expliquer comment procéder: <a href="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/particle_normal_alignment.mb.zip" hreflang="en">particle_normal_alignment.mb.zip</a></p>
<p>Un bon conseil: Mon tuto n'étant qu'une introduction, je vous invite, à garder le billet de YouDaftPunk de coté pour y revenir plus tard, télécharger sa scène et la décortiquer. :redface:</p>
<center>:longBar:</center>
<h5>closestPointOnMesh</h5>
<p>Le fonctionnement du node closestPointOnMesh est en fait assez simple:</p>
<p>En entrée:</p>
<ul>
<li>La position d'un point (x,y,z)</li>
<li>Une surface mesh</li>
</ul>
<p>En sortie:</p>
<ul>
<li>La position d'un autre point (x,y,z), celui qui est sur la surface</li>
<li>Une orientation qui est en fait la normale de la face sur laquelle se trouve le point calculé</li>
<li>Pleins d'autres choses que je n'utiliserai pas</li>
</ul>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya004.png" alt="oriente_particle_maya004.png" style="display:block; margin:0 auto;" title="oriente_particle_maya004.png, sept. 2010" height="290" width="421" /></p>
<p>Résultat:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya002.png" alt="oriente_particle_maya002.png" style="display:block; margin:0 auto;" title="oriente_particle_maya002.png, sept. 2010" height="424" width="556" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya003.png" alt="oriente_particle_maya003.png" style="display:block; margin:0 auto;" title="oriente_particle_maya003.png, sept. 2010" height="226" width="767" /></p>
<p>Je vous donne <a href="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_scene001.ma">->la scène Maya<-</a> (bouton droit de souris, save as...).</p>
<p>Vous pouvez bouger le "locator1", vous verrez que l'autre suit en restant sur la surface! :hehe:</p>
<center>:longBar:</center>
<h5>Avec des particules</h5>
<p>Maintenant me direz vous, comment l'utiliser avec des particules? Et bien si vous avez les bases, vous allez voir que la manœuvre est un peu hasardeuse (et "perf-killer" :baffed: ) mais qu'elle a le mérite d'exister et peut rendre de fiers services!</p>
<p>Créez un mesh ayant une forme un minimum intéressante (mais pas non plus tarabiscotée, closestPointOnMesh n'est en aucun cas le messie qui vous sortira <del>de votre modé dégueulasse</del> :siffle: )</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya005.png" alt="oriente_particle_maya005.png" style="display:block; margin:0 auto;" title="oriente_particle_maya005.png, sept. 2010" height="367" width="364" /></p>
<p>Puis créez un node closestPointOnMesh auquel vous connectez le mesh:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya0051.png" alt="oriente_particle_maya0051.png" style="display:block; margin:0 auto;" title="oriente_particle_maya0051.png, sept. 2010" height="48" width="261" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya0052.png" alt="oriente_particle_maya0052.png" style="display:block; margin:0 auto;" title="oriente_particle_maya0052.png, sept. 2010" height="105" width="488" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya0053.png" alt="oriente_particle_maya0053.png" style="display:block; margin:0 auto;" title="oriente_particle_maya0053.png, sept. 2010" height="89" width="408" /></p>
<center><i>Fastoche! :dentcasse: </i></center>
<p>Créez votre "Emitter from object":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya006.png" alt="oriente_particle_maya006.png" style="display:block; margin:0 auto;" title="oriente_particle_maya006.png, sept. 2010" height="121" width="211" /></p>
<p>Passez votre "Emitter Type" en "Surface":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya007.png" alt="oriente_particle_maya007.png" style="display:block; margin:0 auto;" title="oriente_particle_maya007.png, sept. 2010" height="431" width="416" /></p>
<p>Augmentez le "Rate":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya008.png" alt="oriente_particle_maya008.png" style="display:block; margin:0 auto;" title="oriente_particle_maya008.png, sept. 2010" height="43" width="344" /></p>
<p>Et enlevez la vitesse de vos particules:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya009.png" alt="oriente_particle_maya009.png" style="display:block; margin:0 auto;" title="oriente_particle_maya009.png, sept. 2010" height="69" width="410" /></p>
<p>Lancez votre dynamique, vous devriez obtenir quelque chose comme ça:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya010.png" alt="oriente_particle_maya010.png" style="display:block; margin:0 auto;" title="oriente_particle_maya010.png, sept. 2010" height="421" width="410" /></p>
<center><i>Des particules sur toute la surface!</i></center>
<p>Créez un objet qui sera votre instancer:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya011.png" alt="oriente_particle_maya011.png" style="display:block; margin:0 auto;" title="oriente_particle_maya011.png, sept. 2010" height="349" width="388" /></p>
<center><i>Une flèche... Notez l'originalité :pasClasse: </i></center>
<p>Sélectionnez-le puis transformez-le en instancer:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya012.png" alt="oriente_particle_maya012.png" style="display:block; margin:0 auto;" title="oriente_particle_maya012.png, sept. 2010" height="252" width="221" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya013.png" alt="oriente_particle_maya013.png" style="display:block; margin:0 auto;" title="oriente_particle_maya013.png, sept. 2010" height="462" width="445" /></p>
<center><i>Essayez de ne pas regarder en haut... :hihi: </i></center>
<p>Nous allons maintenant jouer avec les expressions pour orienter nos particules à la création.</p>
<p>Dans votre système de particule, créez deux attributs de type "vecteur par particule": aimUp, aimDir.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya014.png" alt="oriente_particle_maya014.png" style="display:block; margin:0 auto;" title="oriente_particle_maya014.png, sept. 2010" height="119" width="206" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya015.png" alt="oriente_particle_maya015.png" style="display:block; margin:0 auto;" title="oriente_particle_maya015.png, sept. 2010" height="257" width="408" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya016.png" alt="oriente_particle_maya016.png" style="display:block; margin:0 auto;" title="oriente_particle_maya016.png, sept. 2010" height="160" width="223" /></p>
<p>Dans l'onglet "Instancer" de votre "particle system", settez Aim Direction sur la variable aimUp puis Aim Axis sur la variable aimDir:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya017.png" alt="oriente_particle_maya017.png" style="display:block; margin:0 auto;" title="oriente_particle_maya017.png, sept. 2010" height="229" width="300" /></p>
<p>Créez une expression à la création:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya018.png" alt="oriente_particle_maya018.png" style="display:block; margin:0 auto;" title="oriente_particle_maya018.png, sept. 2010" height="84" width="358" /></p>
<p>Voici l'expression:</p>
<pre class="mel mel"><span style="color: #666666; font-style: italic;">// on "regarde vers le haut"</span>
particleShape1.<span style="color: #202020;">aimDir</span> <span style="color: #339933;">=</span> <span style="color: #339933;"><<</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">>>;</span>
<span style="color: #666666; font-style: italic;">// on donne les infos de position de la particule au node</span>
vector $p <span style="color: #339933;">=</span> particleShape1.<span style="color: #202020;">position</span><span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> $x <span style="color: #339933;">=</span> $p.<span style="color: #202020;">x</span><span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> $y <span style="color: #339933;">=</span> $p.<span style="color: #202020;">y</span><span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> $z <span style="color: #339933;">=</span> $p.<span style="color: #202020;">z</span><span style="color: #339933;">;</span>
setAttr closestPointOnMesh1.<span style="color: #202020;">inPosition</span> $x $y $z<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// on récupère la normal qu'on donne comme information a la particule</span>
vector $normal <span style="color: #339933;">=</span> `getAttr closestPointOnMesh1.<span style="color: #202020;">normal</span>`<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// et on oriente la particule</span>
particleShape1.<span style="color: #202020;">aimUp</span> <span style="color: #339933;">=</span> $normal<span style="color: #339933;">;</span></pre>
<blockquote><p>Note: Certains tiqueront et diront que l'utilisation des "setAttr" et "getAttr" est à proscrire lors de l'évaluation d'une expression car elles détruisent les perfs. Ils auront raison :hehe: . Mais le soucis vient de "l'évaluation des nodes Maya" (la "computation"). Celle ci ne se fait qu'une fois l'évaluation des particules terminé.
Donc si on n'utilise pas de setAttr/getAttr, on ne force pas le node à recalculer ses valeurs, résultat, c'est comme si vous aviez évalué une particule et que toute les autres se récupères les même valeurs que la première, ça donne des choses assez drôle (qui peuvent être intéressantes dans certains cas).</p></blockquote>
<p>Remettez-vous à la frame 1 pour virer vos particules puis calculez quelques images de dynamique:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya019.png" alt="oriente_particle_maya019.png" style="display:block; margin:0 auto;" title="oriente_particle_maya019.png, sept. 2010" height="571" width="549" /></p>
<p>Et voila le travail! :banaeyouhou:</p>
<p>Voici <a href="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_scene002.ma">->la scène Maya<-</a> (bouton droit de souris, save as...).</p>
<p>A partir de là vous pouvez faire pas mal de choses.</p>
<p>Ici nous orientons les particules à la création, ce qui suppose qu'elles ne bougent pas.</p>
<p>Si c'est le cas, il faudra recréer une expression "Runtime before dynamics" qui réoriente les particules.</p>
<p>Je vous invite à regarder <a href="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/particle_normal_alignment.mb.zip" hreflang="en">la scène de YouDaftPunk </a> qui va encore plus loin que moi (pas difficile cela dis) en animant des particules le long de la surface, de manière aléatoire.</p>
<p>Si vous vous en êtes sortis avec ce tuto, vous devriez pouvoir vous débrouiller avec sa scène. :sourit:</p>
<center>:longBar:</center>
<h5>Conclusion</h5>
<p>J'espère que ce petit tuto vous aura appris quelque chose et/ou dépanné. Personnellement, c'est vraiment le genre de trucs qui se fait en trois cliques dans les autres softs 3D mais qui demande pas mal de technique dans Maya (comme d'hab, il faut bien justifier son salaire! :aupoil: ).</p>
<p>Si vous avez des questions, que je n'ai pas été assez clair ou qu'il manque une information, n'hésitez pas à laisser un commentaire.</p>
<p>A bientôt!</p>
<p>Dorian</p>
<center><i>:marioCours:</i></center>
<center>:longBar:</center>
<h5>Méthode alternative: Le Goal World Normal</h5>
<p>EDIT: Suite au commentaire de <a href="http://www.joss-vfx.com/" hreflang="fr">Joss</a>, je vous propose une méthode alternative qui est beaucoup plus rapide. :siffle:</p>
<p>Dans un premier temps, sélectionner votre géométrie:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0001.png" alt="oriente_particle_maya_second0001.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0001.png, sept. 2010" height="466" width="437" /></p>
<p>Faite un "Emit from Object" mais en sélectionnez les options:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0002.png" alt="oriente_particle_maya_second0002.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0002.png, sept. 2010" height="121" width="215" /></p>
<p>Passer "l'Emitter type" en Surface:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0003.png" alt="oriente_particle_maya_second0003.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0003.png, sept. 2010" height="104" width="307" /></p>
<p>Et surtout cochez "Need parent UV (NURBS)":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0004.png" alt="oriente_particle_maya_second0004.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0004.png, sept. 2010" height="58" width="235" /></p>
<p>Maintenant nous allons convertir la surface émettrice de particule en "Goal".</p>
<p>Sélectionnez le système de particule:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0005.png" alt="oriente_particle_maya_second0005.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0005.png, sept. 2010" height="59" width="197" /></p>
<p>Puis votre surface:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0006.png" alt="oriente_particle_maya_second0006.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0006.png, sept. 2010" height="104" width="248" /></p>
<p>Et passer tout ça en "Goal":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0007.png" alt="oriente_particle_maya_second0007.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0007.png, sept. 2010" height="212" width="205" /></p>
<p>Maintenant allez dans votre particleShape:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0008.png" alt="oriente_particle_maya_second0008.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0008.png, sept. 2010" height="42" width="125" /></p>
<p>Et créez deux attributs (goalU et goalV) de type Flaot Per Particule:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0009.png" alt="oriente_particle_maya_second0009.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0009.png, sept. 2010" height="77" width="203" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0010.png" alt="oriente_particle_maya_second0010.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0010.png, sept. 2010" height="258" width="416" /></p>
<p>Une fois cela fait, nous allons créer une expression de création de particule:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0011.png" alt="oriente_particle_maya_second0011.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0011.png, sept. 2010" height="67" width="311" /></p>
<p>Et copiez juste ça:</p>
<pre class="mel mel">goalU <span style="color: #339933;">=</span> parentU<span style="color: #339933;">;</span>
goalV <span style="color: #339933;">=</span> parentV<span style="color: #339933;">;</span></pre>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0012.png" alt="oriente_particle_maya_second0012.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0012.png, sept. 2010" height="240" width="612" /></p>
<p>Puis cliquez sur création:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0013.png" alt="oriente_particle_maya_second0013.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0013.png, sept. 2010" height="78" width="180" /></p>
<p>Maintenant allez dans l'onglet "Goal Weights and Objects":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0014.png" alt="oriente_particle_maya_second0014.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0014.png, sept. 2010" height="42" width="267" /></p>
<p>Et cliquez sur "Create Goal World Normal 0 PP"</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0015.png" alt="oriente_particle_maya_second0015.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0015.png, sept. 2010" height="36" width="369" /></p>
<p>Les particules ont donc maintenant leurs valeurs de Goal, qui sont en fait les valeurs d'UV de la surface. :sourit:</p>
<p>Pour rendre le tout plus visible nous allons créer notre instancer. :joue:</p>
<p>Sélectionnez la géométrie à instancier:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0016.png" alt="oriente_particle_maya_second0016.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0016.png, sept. 2010" height="61" width="57" /></p>
<p>Puis sélectionnez votre "particle system":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0017.png" alt="oriente_particle_maya_second0017.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0017.png, sept. 2010" height="59" width="197" /></p>
<p>Créez l'instancer:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0018.png" alt="oriente_particle_maya_second0018.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0018.png, sept. 2010" height="79" width="210" /></p>
<p>Et pour finir, dans l'onglet "Instancer (Geometry Replacement)", mettez la "Aim Direction" sur "goalWorldNormal0PP":</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0019.png" alt="oriente_particle_maya_second0019.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0019.png, sept. 2010" height="207" width="235" /></p>
<p>Bougez votre timeline pour générer des particules:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0020.png" alt="oriente_particle_maya_second0020.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0020.png, sept. 2010" height="566" width="503" /></p>
<center><i>Tadaa!</i></center>
<p>Comme vous pouvez le constater, vous voyez que les instancers ne sont pas bien alignés. :mechantCrash:</p>
<p>C'est dû au fait que goalWorldMesh utilise l'axe X comme axe de référence. Mais il suffit de rajouter attribut (aimUp) et de l'orienter sur l'axe Y (qui est l'axe de ma flèche):</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0021.png" alt="oriente_particle_maya_second0021.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0021.png, sept. 2010" height="78" width="168" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0022.png" alt="oriente_particle_maya_second0022.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0022.png, sept. 2010" height="263" width="336" /></p>
<p>Entrez dans l'expression de création de la particule:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0023.png" alt="oriente_particle_maya_second0023.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0023.png, sept. 2010" height="57" width="312" /></p>
<p>Ajoutez:</p>
<pre class="mel mel">particleShape1.<span style="color: #202020;">aimUp</span> <span style="color: #339933;">=</span> <span style="color: #339933;"><<</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">>>;</span></pre>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0024.png" alt="oriente_particle_maya_second0024.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0024.png, sept. 2010" height="115" width="369" /></p>
<p>Validez puis mettez "Aim Axis" sur votre nouvel attribut: aimUp</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0025.png" alt="oriente_particle_maya_second0025.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0025.png, sept. 2010" height="265" width="238" /></p>
<p>Et voila le travail:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_second0026.png" alt="oriente_particle_maya_second0026.png" style="display:block; margin:0 auto;" title="oriente_particle_maya_second0026.png, sept. 2010" height="475" width="448" /></p>
<p>Vous remarquerez aussi que ça va beaucoup plus vite! :aupoil:</p>
<p>Voici <a href="https://www.fevrierdorian.com/blog/public/billets/2010_09_13_oriente_particle_maya/oriente_particle_maya_scene003.ma">->la scène Maya<-</a> (bouton droit de souris, save as...).</p>
<p>Un grand merci à <a href="http://www.joss-vfx.com/" hreflang="fr">Joss</a> pour cette méthode!</p>
<p>A bientôt!</p>
<p>Dorian</p>