Les Xemitters
Fonctionnement
Le Xemitter est la deuxième grande catégorie d'emitter, avec le *Emitter qui occupe les premiers tuto de cette série. Le Xemitter fut créé par les membres de Digital Extremes qui ont travaillé sur Unreal conjointement avec Epic Games, ces derniers ayant utilisé des *Emitters "normaux". Il permet de recréer les mêmes effets qu'un sprite emitter normal, et en censé être plus facile à paramétrer vu que vous n'êtes pas noyé sous le flot de paramètres aux noms abscons. Ajoutez le Xemitter. Il se situe ici dans l'actor browser :
A peine ajouté, il émet déjà la texture par défaut des emitters. En le sélectionnant, vous pouvez d'ailleurs voir qu'il est directionnel : il est muni d'une flèche, et si vous changez son orientation, les particules sont émis suivant le flèche, et non pas selon des paramètres absolu comme avec les emitter "normaux". Cela devrait déjà vous faciliter la tache.
Pour commencer, nous allons changer la texture émise. Pour cela, allez dans le package "Epic Particle". Comme j'ai décidé que nous utiliserions cet emitter pour faire de la fumée, j'ai été dans le group "Smoke" et j'ai pris la texture "StellarFog1aw". Pour l'ajouter, dans les propriétés de l'Xemitter, onglet "display", allez dans la propriété "Skins". Il y a déjà un objet paramétré, qui n'est autre que la texture de base de l'emitter. Cliquez dessus puis sur le bouton "util" : la texture change immédiatement.
Maintenant, tout va se passer dans les trois onglets propres du Xemitter : pclBeam, pclEmitter, pclMovement, pclSoftbody et pclVisuals.
Commençons par explorer les propriétés de l'onglet pclEmitter :
bSuspendWhenNotVisible : le Xemitter s'arrête de fonctionner lorsqu'il n'est plus visible. Cela permet d'améliorer les performances lorsque beaucoup d'effets sont centré dans une grande pièce.
mChildName : permet théoriquement de donner un nom aux particules émises par cet Xemitter.
mDelayRange : permet de retarder l'émission de particules d'un temps aléatoire entre les deux bornes que vous spécifiez. Notez qu'une fois que la première particule a été émise, les autres suivent normalement et ne sont pas affectées.
mLifeRange : Permet de définir les bornes maximales et minimales de la durée de vie des particules.
mMaxParticles : Nombre maximales de particules venant de cet emitter qui peuvent se trouver dans la carte. Quand il y a autant de particules que spécifié dans cette propriété, l'émission s'arrête et ne reprend que quand une particule disparait.
mParticleType : défini le type de particules.
- -PT_Sprite : les particules sont émises normalement, et font toujours face à la camera.
- -PT_Stream : Plante UnrealEd, tout simplement.
- -PT_Line : envoi les particules sous forme d'une ligne : la texture est écrasée sur les flancs.
- -PT_Disc : la particule est émise perpendiculairement à son axe de direction. Elle ne fait pas face à la camera.
- -PT_Mesh, PT_Branch et PT_Beam : n'émettent rien, sauf dans des cas très particuliers.
mRegen : si mis à oui, les particules mortes se régénèrent. Si mise à non, les particules mortes ne se régénèrent pas : le Xemitter envoi ses particules puis devient inutile. Attention, l'utilisation de cette propriété à tendance à rendre le Xemitter quasiment inopérant et force à le refabriquer. Laissez donc cette propriété tranquille.
mRegenDist : pour l'instant, il semble que cela stoppe simplement l'émission de particules.
mRegenOffTime et mRegenOnTime : Le premier contrôle l'intervalle de temps pendant lequel le Xemitter n'émet pas. Le deuxième spécifie l'intervalle de temps pendant lequel le Xemitter émet des particules. Ces deux propriétés ne servent à rien si vous n'activez pas mRegenRange.
mRegenPause : permet de mettre en pause l'émission des particules : le Xemitter reste prèt à fonctionner. Pratique dans les vues confuses où les particules gênent des sélections ou la vue.
mRegenRange : permet d'utiliser les cycles de On et de Off définis dans RegenOffTime et RegenOnTime. Les valeurs contrôlent le système de manière assez étrange : si les deux valeurs de mRegenRange sont à 1, les deux propriétés mRegenOff et mRegenOn sont utilisées normalement. Si vous changez les valeurs du champ [1], vous influez sur le nombre de particules émises pendant le temps d'activation du Xemitter.
mSourceActor : semble n'avoir aucun effet.
mSpawningType : spécifie la zone d'apparition des particules. Je ne peu que vous encourager à faire des tests pour vérifier les différents effets.
mstartparticle : nombre de particules qui sont émises instantanément à l'activation de l'emitter. Il semble que cette valeur ne puisse pas dépasser 400.
SourceStaticMesh : détermine le Static Mesh qui sert de source ? Semble en tout cas ne pas fonctionner pour l'instant.
Il se peut que vous ayez à manipuler quelques paramètres de cet onglet, comme le nombre maximum de particules par exemple. La plupart du temps, vous utiliserez les autres onglets, notamment pclMovement qui va influer sur le mouvement et la vitesse de vos particules.
mAirResistance : résistance de l'air. Cette propriété détermine la vitesse de ralentissement de la particule avec le temps. Si vous mettez "0", l'air n'oppose aucune résistance, et la vitesse des particules est constante, sans aucune diminution. Si vous mettez "10", l'air est quasiment solide et la particule ne bouge qu'à peine.
mAttraction : force d'attraction des particules entre elles. Plus la valeur est haute, plus les particules s'attirent les unes les autres. L'effet n'est pas flagrant.
mColElsaticity : censé déterminer la force de rebondissement des particules.
mCollision : active et désactive la collision des particules avec le décor. Semble ne pas fonctionner.
mColMakeSound : permet théoriquement d'activer l'utilisation d'un son au moment de la collision des particules avec le reste du décor. Semble ne pas fonctionner.
mDirDev : Permet de définir la direction du mouvement des particules par rapport à l'axe défini par l'orientation du Xemitter. plus la valeur est grande, plus les particules partiront dans un axe éloigné de la direction de l'emitter.
mMassRange : valeur influençant la gravitée appliqué aux particules : plus la valeur est haute, plus les particules tombent vite et fort. Valeur à augmenter proportionnellement à la vitesse des particules si l'on veut que l'effet obtenu soit assez réaliste. Les valeurs négatives donne un effet de gravitée inversée : les particules montent. Une valeur de 0 annule toute gravitée : les particules avancent en ligne droite, sans jamais être influencé par les chutes.
mOwnerVelocityFactor : censé influencer la vitesse des particules en fonction de celle de l'actor source. N'a aucun effet.
mPosDev : Permet de définir une zone autour de l'emitter ou les particules apparaissent. Permet d'éviter de faire partir toute les particules du même point exactement identique.
mPosRelative : permet de joueur sur la relation des particules avec l'actor xemitter. Si vous laissez cette propriété sur faux et que vous déplacez le xemitter, les particules sont émises et continuent leur chemin par rapport au point où elles sont émises, sans tenir comte de la nouvelle position de l'emitter. Si vous mettez cette propriété à "Vrai", toutes les distances et vitesses sont calculées à partir du Xemitter. Si vous déplacez les Xemitter, les particules se déplacent avec.
mSpawnVecA et mSpawnVecB : pas d'effet.
mSpeedRange : détermine la vitesse maximale et minimale des particules.
mSpinRange : vitesse maximales et minimales de rotation des particules sur elles-mêmes. Si laissée à 0, les particules ne tournent pas.
Les propriétés de l'onglet PclSoftBody n'ont absolument aucun effet sur les particules ni sur le Xemitter. Intéressons-nous plutôt à l'onglet PClVisuals :
mAttenFunc : Permet de définir le degré d'opacité de la particule selon son avancée dans sa vie. Remplace l'onglet "Fading" des emitters normaux.
- ATF_LerpInOut : paramètre par défaut, les particules apparaissent, deviennent opaques, puis disparaissent lentement.
- ATF_ExplInOut : Les particules apparaissent et deviennent très vite opaque, le restent très peu de temps puis commencent un long fondu pour disparaitre.
- ATF_SmoothStep : les particules apparaissent lentement et disparaissent brusquement.
- ATF_Pulse : les particules sont quasiment invisibles, sauf vers le milieu de leur vie où elles deviennent légèrement opaque.
- ATF_Random : l'opacité des particules est aléatoire et change à chaque instant. cela produit un effet de "clignotement" insupportable.
- ATF_None : les particules apparaissent subitement et disparaissent aussi soudainement.
AttenKA et mAttenKB : définissent l'équilibre des fadings. Pour expliquer simplement, si mAttenKA est plus élevé que mAttenKB, le fade -in sera plus long que le fade-out : les particules apparaitrons plus lentement qu'elles ne disparaitront.
mAttenuate : si cette propriété est mise à "faux", les particules n'utilisent pas de fondu.
mColorRange : permet de paramétrer les couleurs de départ et de fin des particules. Pendant toute l'existence de la particule, la couleur de départ fait un fondu pour arriver à celle de fin.
mDistanceAtten : permet théoriquement de rendre les particules transparente selon la distance de la camera à l'actor. Ne semble pas fonctionner.
mGrowthRate : vitesse d'agrandissement de la particule au cours de sa vie. Plus la valeur est grande, plus la particule à une croissance exponentielle.
mLifeColorMap : nécessite quelques explications. Si vous allez voir dans le package emitterTextures, le contenu du groupe Lifemaps, vous verrez plusieurs textures qui ne sont que des dégradés. Si vous en spécifiez une dans cette propriété, la couleur de votre particule sera celle du bas de la texture, et au fur et à mesure de sa vie, la couleur suivra la texture en la remontant. Ces textures peuvent être créé extérieurement en faisant des fondus entre des couleurs.
mMeshNodes : sert théoriquement à afficher les particules sur les vertices d'un Static mesh prédéfini. Ne semble pas fonctionner.
mNumTilColumns : défini le nombre de colonnes sur la texture. Utilisé conjointement à la propriété suivante, permet de subdiviser la texture pour faire se succéder les morceaux de textures prévus à cet effet.
mNumTilRows : défini le nombre de lignes sur la texture.
mPosColorMapXY et mPosColorMapXZ: pas d'effet. Sert peut-être théoriquement à changer la couleur de la particule selon sa localisation.
mRandMeshes : pas d'effet.
mRandOrient : change aléatoirement l'orientation de chaque particule.
mRandTextures : devrait permettre de sélectionner aléatoirement une texture pour chaque particule. Ne fonctionne pas.
mSizeRange : Tailles minimales et maximales de chaque particule.
mTileAnimation : active et désactive l'animation des particules par le passage d'une subdivision à l'autre de la texture.
UseMeshesNodes : sans effet.
Dans notre cas, nous désirons créer de la fumée. Nous désirons qu'elle s'élève, mais en partant de coté pour simuler sa sortie d'un tuyau par exemple, ou par une fissure de la coque d'on ne sait quel emballage. Pour l'instant, voici notre emitter :
Pour commencer, nous nous apercevons que notre texture ne s'affiche pas correctement, il y a plein de zones noires qui devraient être transparentes mais qui restent visibles. Pour résoudre cela, allez dans l'onglet "display", et modifiez le paramètre "Style". Vous pouvez essayer les différents paramètres pour voir les différents effets. Le paramètre que nous allons utiliser est "STY_Transluscent". On pourrait également utiliser STY_Alpha, mais les particules seraient moins visibles.
Voilà où nous en somme. Maintenant, allez dans l'onglet "PclVisuals" et multipliez la taille des particules par 2 en changeant les valeurs de "Size" à 20.
C'est bien. Maintenant nous allons nous intéresser aux mouvements des particules. Nous voulons :
- -qu'elles montent
- -quelles avancent
- -qu'elles grossissent avec le temps
- -qu'elles soient plus nombreuses.
Pour les faire avancer, allons dans l'onglet PclMovement et mettons dans "mSpeedRange" 80 au maximum et 70 au minimum. Ensuite, changer "mMassRange" en -0.25 pour le minimum Et le maximum.
Maintenant, il faudrait qu'elles grossissent avec le temps. Pour cela, allez changer mGrowthRate dans l'onglet PclVisuals. Mettez par exemple "8". L'effet n'est pour l'instant pas vraiment spectaculaire. Pour corriger cela, nous allons diminuer la vie des particules, et augmenter leur nombre. Allez dans l'onglet "PclEmitter". Pour raccourcir leur vie, divisez par deux les valeurs de "mLifeRange". Mettez 2 au minimum et au maximum. Pour augmenter leur nombre, mettez 25 au minimum et au maximum de "mRegenRange" :
L'effet est meilleur, mais l'on voit que les particules sont toute les mêmes. Pour adoucir cet effet, changez, dans l'onglet PclMovement, "mSpinRange" : mettez 800 et 250.L'effet n'en sera que meilleur :
L'effet est bon :
Vous avez utilisé les propriétés les plus importantes d'un Xemitter. Nous allons maintenant voir comment réaliser un effet plus complexe : une flamme.
Créez donc un nouvel Xemitter, et placez le non loin du premier :
Nous allons choisir une texture subdivisée. Je prendrais comme exemple, la texture LargeFlames du group "MultiFrames" du package "EmitterTextures".
Allez la spécifier dans les paramètres du xemitter (pour rappel Display=>Skin), et profitez-en pour changer Style en STY_Transluscent :
Pour utiliser la subdivision des textures, allez dans l'onglet PclVisuals. Changez mNumTIlesRows et mNumTilColumns en "4", car notre texture a 4particules de long et 4 de haut :
Il reste encore plusieurs défauts. Pour commencer, les particules sont beaucoup trop lentes. Elles sont de plus beaucoup trop peu nombreuses. Pour simuler la vitesse de mouvement d'une flamme, allez dans l'onglet PclMovement et mettez à mSpeedRange 150 de maximum et 100 de minimum.
Pour diminuer leur durée de vie, changez ensuite dans l'onglet PclEmitter et changez mLifeRange à max=1 et min=0.5 :
Maintenant, il va falloir jouer sur le nombre des particules. Pour cela, nous allons augmenter les valeurs de mRegenRange : mettez par exemple 35 et 30 comme valeurs maximales et minimales :
Maintenant, il va falloir faire en sorte que les particules diminuent au cours de leur vie pour donner l'illusion de l'étrécissement des flammes. Ensuite, il va falloir modifier la zone d'apparition des flammes pour ne pas avoir ce jet de flammes ponctuel qui nous avons actuellement et qui donne une ligne de flammes. Pour modifier la zone d'apparition, il va falloir modifier l'axe de l'emitter. En effet, l'idée est que les flammes vont monter. Donc faites pivoter votre Xemitter pour que l'axe pointe vers le haut :
Car nous allons modifier les paramètres X et Y de la zone d'apparition, et nous avons besoin de voir les résultats. Dans l'onglet PclMovement, changez mPosDev : mettez 10 à X et Y :
Maintenant, le dernier problème : les particules doivent être plus grosses pour que nous puissions les faire diminuer. Allez dans l'onglet PclVisuals (encore) et changez mSizeRange. Mettez 30 au max et 20 à min. Il n'y a plus qu'à les faire rétrécir avec le temps : mettez une valeur négative dans mGrowthRate :
Votre flamme est prête. Bien sur, vous ne pouvez pas avoir une gestion aussi poussé qu'avec un emitter traditionnel. Néanmoins, l'effet peut -être obtenu plus rapidement et peut-être plus simplement avec un Xemitter. Cela demande tout de même un peu d'entrainement pour tout de suite comprendre quelles propriétés vont influencer le rendu final, ce qui n'était pas vraiment le cas avec l'emitter d'Epic, où chaque effet pouvait être paramétré indépendamment :
Par ailleurs, soyez averti que si vous fermez l'éditeur et que vous relancez votre map, les Xemitter ne sont pas activés par défaut, et il faut aller tripoter leurs propriétés pour qu'ils daignent se remettre en marche. C'est un bug inhérent aux Xemitter. De même, il est possible qu'après avoir réactivé votre Xemitter, l'effet ne soit pas du tout le même que celui que vous aviez paramétré la dernière fois. C'est un autre bug. Si vous testez la map, vous constaterez que le Xemitter émet pourtant les particules comme vous l'aviez spécifié la dernière fois. Dans ce cas ne cherchez pas à comprendre, et laissez le tranquille pour ne pas gâcher votre effet.