TrailEmitter
Le TrailEmitter est un système de particules permettant d'ajouter des traînes à des objets en mouvement. Au lieu de créer des particules indépendantes, il étire une texture le long d'une chaîne de points de passage qui accompagne le déplacement.
Le TrailEmitter n'existe pas dans UT2003 et son fonctionnement n'est pas expliqué sur l'UDN car il s'agit d'un ajout tardif au moteur d'UT2004. Il permet de remplacer les traînes générées par le xEmitter de Digital Extremes, qui est utilisé entre autres pour le ruban de couleur qui suit la balle du mode BR ou pour créer les traînes jaunes aux pieds des joueurs utilisant le combo d'adrénaline Vitesse.
Les traînes sont un effet très spécifique et, à ce titre, peu courant. Leur utilisation la plus remarquée est la traînée de condensation qui se forme aux pointes des "ailes" du Raptor lorsqu'il se déplace à haute vitesse.
Utilisation classique
Le TrailEmitter s'ajoute à un Emitter de façon normale.
L'utilisation la plus classique du TrailEmitter consiste à l'attacher à un objet en mouvement via son AttachTag (qui doit alors correspondre au Tag d'un objet mobile) et de générer la traîne derrière l'Emitter lui-même. Pour ce faire, il faut se rendre dans les propriétés du TrailEmitter et changer Trail → TrailLocation en PTTL_FollowEmitter. En déplaçant l'Emitter dans l'éditeur avec le rendu en temps réel activé, on peut déjà constater que l'actor laisse une traîne derrière lui avec la texture par défaut.
Bien entendu, la texture peut être changée dans l'onglet Texture, comme pour un SpriteEmitter et sa taille (mais pas sa longueur) se modifie dans l'onglet Size. Il faut privilégier les textures de type "flare", avec une étoile brillante au centre, qui s'étirent en laissant une traîne aux extrémités douces, ou les textures présentant une pointe à une extrémité pour donner une longue extrémité pointue. Si la texture est relativement unie, la traîne aura l'aspect d'un ruban. Dans l'exemple suivant, les traînes ont été allongés et des textures de différents types sont utilisées.
Les paramètres de couleur, de fade in/out, etc. sont également fonctionnels. Afin de paramétrer la longueur et la persistance de la traîne, cependant, il faut revenir à l'onglet Trail et modifier les paramètres DistanceThreshold et MaxPointsPerTrail.
La traîne est constituée de "points" semés à intervales réguliers, le long desquels la traîne est dessinée en étirant une feuille 2D portant la texture choisie.
- DistanceThreshold : La distance maximale séparant les points entre lesquels la texture est étirée. Plus cette distance est courte, plus la géométrie de l'effet est dense.
- MaxPointsPerTrail : Le nombre de points dont la traîne peut être constituée au maximum.
L'interaction de ces deux propriétés permet d'ajuster la résolution de l'effet. Si la traîne effectue des virages serrés, DistanceThreshold doit être court pour que la trajectoire soit échantillonnée assez souvent, ce qui permet de dessiner des courbes lisses. Afin de garder une bonne longueur, il faudra donc augmenter MaxPointsPerTrail. À l'inverse, si la traîne accompagne un objet très rapide mais à la trajectoire relativement droite, DistanceThreshold peut être plus élevé et MaxPointsPerTrail peut être baissé pour que la traîne soit formée de segments moins nombreux mais plus longs. La combinaison des deux propriétés détermine la longueur finale de la traîne.
À titre de comparaison, les traînées de condensation aux extrémités du Raptor utilisent DistanceThreshold = 50 et MaxPointsPerTrail = 100. Cela donne des traînées moyennes, ne nécessitant pas un nombre trop élevé de particules. Le Raptor ayant un mouvement "glissant" prononcé, il n'a pas besoin de faire des angles trop abrupts, mais la traînée a malgré tout la résolution suffisante pour accompagner son mouvement lorsqu'il reçoit un choc.
L'onglet Location peut être utilisé pour excentrer le point d'attache de la traîne par rapport à l'actor Emitter ou même pour spawner non pas sur un point mais sur une zone avec LocationRange. Dans ce dernier cas, une fois l'Emitter en mouvement, on s'aperçoit que plusieurs traînes sont spawnées à la fois, en nombre égal à la valeur inscrite dans General → MaxParticles (par défaut, 10). Chaque traîne est en effet considérée comme une particule à part entière. Par défaut, donc, le TrailEmitter génère non pas 1 mais 10 traînes. Si LocationRange n'est pas utilisé, toutes ces traînes sont simplement superposées derrière l'Emitter. Notez que la traîne du Raptor a MaxParticles = 1 : chaque traînée est bien une seule particule.
Traînes de particules
Il est possible d'attacher les traînes non pas à l'actor Emitter, mais aux particules d'un autre système de particules dans le même Emitter.
Pour ce faire, il suffit d'ajouter un autre système de particules à l'Emitter (par exemple un SpriteEmitter ou un MeshEmitter) et d'entrer son numéro dans Location → AddLocationFromOtherEmitter et dans Velocity → AddVelocityFromOtherEmitter. Les traînes seront alors spawnées au niveau des sprites ou des static-meshes que l'Emitter source génère et suivront leur mouvement.
Notez que l'accélération des particules ne peut pas être héritée de cette façon. Si le SpriteEmitter ou le MeshEmitter utilise l'onglet Acceleration, la traîne se détachera progressivement de la particule au fur et à mesure que ces paramètres feront effet (la traîne ne suivra que la vitesse de l'onglet Velocity). Il faut alors donner au TrailEmitter les mêmes accélérations que les sprites ou static-meshes.
Si TrailLocation = PTTL_FollowEmitter, les traînes additionnent leur mouvement (ou celui qu'elles héritent d'un autre Emitter) au mouvement de l'actor Emitter lui-même, ce qui peut donner des résultats étranges quand l'Emitter n'est pas fixe.
Le problème est résolu en utilisant TrailLocation = PTTL_AttachedToParticle. Chaque traîne devient alors totalement indépendante et l'Emitter peut être soumis à n'importe quel déplacement sans les affecter (leur vitesse n'est pas additionnée à celle de l'actor). En revanche, PTTL_AttachedToParticle empêche d'utiliser une traîne accrochée à l'actor lui-même car celui-ci n'entraîne justement plus les particules lorsqu'il bouge.
De la même façon, les traînes peuvent recevoir leur propre mouvement avec les onglets Velocity et Acceleration, sans utiliser le mouvement et la position d'un autre système de particules.
Durée de vie
La durée de vie de la traîne résulte de l'interaction entre la durée de vie totale de chaque particule (Time → LifeTimeRange), qui affecte la traîne dans son ensemble, et la durée de vie de chaque point de la trajectoire de la traîne (Trail → PointLifeTime).
La traîne génère des points en continu sur sa trajectoire. Lorsque MaxPointsPerTrail est atteint, les points plus anciens sont effacés à l'arrière au fur et à mesure que de nouveaux points sont créés à l'avant de la traîne. Si le mouvement n'est pas assez rapide ou ample pour atteindre MaxPointsPerTrail, les points ne sont pas automatiquement remplacés et leur disparition se fait en utilisant PointLifeTime, chaque point possédant sa propre durée de vie. Si PointLifeTime = 0, les points ont une durée de vie illimitée et restent visibles tant que la traîne reste en jeu.
Une fois la durée de vie de la particule (LifeTimeRange) écoulée, la traîne expire et tous les points restants sont effacés d'un coup. Il faut donc s'assurer que la durée de vie globale de la traîne soit assez élevée pour que la durée de vie des points arrive à expiration avant que la traîne ne soit intégralement purgée.
Affichage
Les derniers paramètres de l'onglet Trail permettent de modifier la façon dont les traînes sont affichées.
- MaxTwistAngle : Spécifie la rotation maximale que chaque point de la traîne peut effectuer pour faire face autant que possible à la caméra. Si ce champ est réglé sur 0, la traîne est toujours parallèle à sa trajectoire, quel que soit l'angle de vue. Si l'angle de vue est trop important, il est possible qu'elle soit invisible car la feuille sans épaisseur se trouve alors parallèle au point de vue du joueur. Avec une valeur de 16384 (un quart de cercle complet), un quart de rotation peut être fait. Si la trajectoire est parfaitement horizontale, un angle de 0 correspond à une traîne parfaitement plate, là où 16384 permet aux points d'afficher leur texture à la verticale pour présenter toute leur largeur à la caméra. Cette propriété est ignorée sur UseCrossedSheets est activé.
- UseCrossedSheets : Ignore MaxTwistAngle et affiche la traîne sous la forme de deux feuilles perpendiculaires. Le résultat est un effet volumétrique plus prononcé et sans les inconvénients d'un unique plan auquel une torsion est appliqué, mais au prix d'un effet deux fois plus exigeants (car deux traînes perpendiculaires sont générées à chaque particule) et au rendu plus brouillon, le centre de la traîne étant beaucoup plus brillant que le reste de l'effet à cause de la superposition des deux feuilles.
Le dernier paramètre, TrailShadeType, détermine le fondu de la traîne.
- PTTST_None : Pas de fondu. Chaque point reste pleinement visible jusqu'à sa suppression, que ce soit suite à l'expiration de sa vie (PointLifeTime) ou parce que MaxPointsPerTrail ayant été atteint, il est supprimé pour créer un nouveau point à l'avant de la traîne.
- PTTST_RandomStatic : Chaque point reçoit une opacité aléatoire et la conserve jusqu'à sa disparition.
- PTTST_RandomDynamic : Identique, mais l'opacité du point est aléatoirement modifiée à chaque tick, ce qui donne un effet de clignotement aléatoire sur la longueur de la traîne.
- PTTST_Linear : Le fondu est appliqué linéairement sur toute la longueur de la traîne, quelle que soit sa longueur, pour que l'avant soit opaque et l'arrière transparent. L'opacité de chaque point dépend donc de sa position dans la traîne.
- PTTST_PointLife : L'opacité de chaque point diminue tout au long de sa vie : il est spawné 100 % opaque et perd en opacité jusqu'à atteindre 0 % à la fin de PointLife. Sa visibilité dépend donc du temps écoulé depuis sa génération.
RSS Feed