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....

:longBar:
Contexte

Je suis tombé sur un thread CGTalk d'une personne demandant justement, comment procéder.

La meilleur réponse fut sans conteste celle de YouDaftPunk qui parle d'un node qui permet de faire ça: "closestPointOnMesh" :sourit:

oriente_particle_maya001.png

Il donne également une scène assez complète pour expliquer comment procéder: particle_normal_alignment.mb.zip

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:

:longBar:
closestPointOnMesh

Le fonctionnement du node closestPointOnMesh est en fait assez simple:

En entrée:

  • La position d'un point (x,y,z)
  • Une surface mesh

En sortie:

  • La position d'un autre point (x,y,z), celui qui est sur la surface
  • Une orientation qui est en fait la normale de la face sur laquelle se trouve le point calculé
  • Pleins d'autres choses que je n'utiliserai pas

oriente_particle_maya004.png

Résultat:

oriente_particle_maya002.png

oriente_particle_maya003.png

Je vous donne ->la scène Maya<- (bouton droit de souris, save as...).

Vous pouvez bouger le "locator1", vous verrez que l'autre suit en restant sur la surface! :hehe:

:longBar:
Avec des particules

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!

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 de votre modé dégueulasse :siffle: )

oriente_particle_maya005.png

Puis créez un node closestPointOnMesh auquel vous connectez le mesh:

oriente_particle_maya0051.png

oriente_particle_maya0052.png

oriente_particle_maya0053.png

Fastoche! :dentcasse:

Créez votre "Emitter from object":

oriente_particle_maya006.png

Passez votre "Emitter Type" en "Surface":

oriente_particle_maya007.png

Augmentez le "Rate":

oriente_particle_maya008.png

Et enlevez la vitesse de vos particules:

oriente_particle_maya009.png

Lancez votre dynamique, vous devriez obtenir quelque chose comme ça:

oriente_particle_maya010.png

Des particules sur toute la surface!

Créez un objet qui sera votre instancer:

oriente_particle_maya011.png

Une flèche... Notez l'originalité :pasClasse:

Sélectionnez-le puis transformez-le en instancer:

oriente_particle_maya012.png

oriente_particle_maya013.png

Essayez de ne pas regarder en haut... :hihi:

Nous allons maintenant jouer avec les expressions pour orienter nos particules à la création.

Dans votre système de particule, créez deux attributs de type "vecteur par particule": aimUp, aimDir.

oriente_particle_maya014.png

oriente_particle_maya015.png

oriente_particle_maya016.png

Dans l'onglet "Instancer" de votre "particle system", settez Aim Direction sur la variable aimUp puis Aim Axis sur la variable aimDir:

oriente_particle_maya017.png

Créez une expression à la création:

oriente_particle_maya018.png

Voici l'expression:

// on "regarde vers le haut"
particleShape1.aimDir = <<0,1,0>>;
 
// on donne les infos de position de la particule au node
vector $p = particleShape1.position;
float $x = $p.x;
float $y = $p.y;
float $z = $p.z;
setAttr closestPointOnMesh1.inPosition $x $y $z;
 
// on récupère la normal qu'on donne comme information a la particule
vector $normal = `getAttr closestPointOnMesh1.normal`;
 
// et on oriente la particule
particleShape1.aimUp = $normal;

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).

Remettez-vous à la frame 1 pour virer vos particules puis calculez quelques images de dynamique:

oriente_particle_maya019.png

Et voila le travail! :banaeyouhou:

Voici ->la scène Maya<- (bouton droit de souris, save as...).

A partir de là vous pouvez faire pas mal de choses.

Ici nous orientons les particules à la création, ce qui suppose qu'elles ne bougent pas.

Si c'est le cas, il faudra recréer une expression "Runtime before dynamics" qui réoriente les particules.

Je vous invite à regarder la scène de YouDaftPunk 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.

Si vous vous en êtes sortis avec ce tuto, vous devriez pouvoir vous débrouiller avec sa scène. :sourit:

:longBar:
Conclusion

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: ).

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.

A bientôt!

Dorian

:marioCours:
:longBar:
Méthode alternative: Le Goal World Normal

EDIT: Suite au commentaire de Joss, je vous propose une méthode alternative qui est beaucoup plus rapide. :siffle:

Dans un premier temps, sélectionner votre géométrie:

oriente_particle_maya_second0001.png

Faite un "Emit from Object" mais en sélectionnez les options:

oriente_particle_maya_second0002.png

Passer "l'Emitter type" en Surface:

oriente_particle_maya_second0003.png

Et surtout cochez "Need parent UV (NURBS)":

oriente_particle_maya_second0004.png

Maintenant nous allons convertir la surface émettrice de particule en "Goal".

Sélectionnez le système de particule:

oriente_particle_maya_second0005.png

Puis votre surface:

oriente_particle_maya_second0006.png

Et passer tout ça en "Goal":

oriente_particle_maya_second0007.png

Maintenant allez dans votre particleShape:

oriente_particle_maya_second0008.png

Et créez deux attributs (goalU et goalV) de type Flaot Per Particule:

oriente_particle_maya_second0009.png

oriente_particle_maya_second0010.png

Une fois cela fait, nous allons créer une expression de création de particule:

oriente_particle_maya_second0011.png

Et copiez juste ça:

goalU = parentU;
goalV = parentV;

oriente_particle_maya_second0012.png

Puis cliquez sur création:

oriente_particle_maya_second0013.png

Maintenant allez dans l'onglet "Goal Weights and Objects":

oriente_particle_maya_second0014.png

Et cliquez sur "Create Goal World Normal 0 PP"

oriente_particle_maya_second0015.png

Les particules ont donc maintenant leurs valeurs de Goal, qui sont en fait les valeurs d'UV de la surface. :sourit:

Pour rendre le tout plus visible nous allons créer notre instancer. :joue:

Sélectionnez la géométrie à instancier:

oriente_particle_maya_second0016.png

Puis sélectionnez votre "particle system":

oriente_particle_maya_second0017.png

Créez l'instancer:

oriente_particle_maya_second0018.png

Et pour finir, dans l'onglet "Instancer (Geometry Replacement)", mettez la "Aim Direction" sur "goalWorldNormal0PP":

oriente_particle_maya_second0019.png

Bougez votre timeline pour générer des particules:

oriente_particle_maya_second0020.png

Tadaa!

Comme vous pouvez le constater, vous voyez que les instancers ne sont pas bien alignés. :mechantCrash:

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):

oriente_particle_maya_second0021.png

oriente_particle_maya_second0022.png

Entrez dans l'expression de création de la particule:

oriente_particle_maya_second0023.png

Ajoutez:

particleShape1.aimUp = <<0,1,0>>;

oriente_particle_maya_second0024.png

Validez puis mettez "Aim Axis" sur votre nouvel attribut: aimUp

oriente_particle_maya_second0025.png

Et voila le travail:

oriente_particle_maya_second0026.png

Vous remarquerez aussi que ça va beaucoup plus vite! :aupoil:

Voici ->la scène Maya<- (bouton droit de souris, save as...).

Un grand merci à Joss pour cette méthode!

A bientôt!

Dorian