Last updated: 06/10/2024, 02:17

Current Project: Rejuvenation of Hellkeeper.net

Projectors

Définition

Un Projector est un actor qui applique une image (la projection), qui peut être une texture ou un material, sur la géométrie dans sa ligne de vue. Cette image est mélangée à la texture des surfaces BSP ou des static-meshes touchés. Le Projector permet de simuler des ombres extrêmement détaillées sans augmenter la définition des lightmaps, de créer des ombres animées en projetant par exemple des materials défilants ou avec une rotation, mais aussi de remplacer les decals pour simuler taches de sang, graffitis, etc.

Fonctionnement

Réduit à sa plus simple expression, le Projector se contente d'une orientation et d'une texture à projeter. Il se trouve dans l'actor browser, environ à la moitié de la liste. Une fois ajouté à la map, il apparaît sous les traits délicieusement anachroniques d'un projecteur cinématographique. Il s'agit d'un actor directionnel, dont une flèche rouge matérialise l'orientation quand il est sélectionné.

Projector dans l'actor browser

Dans ses propriétés, l'onglet Projector contient tous les paramètres de l'actor, dont le plus important est bien entendu ProjTexture, qui détermine la texture projetée. Dès qu'une texture est ajoutée, elle est aussitôt visible et projetée en taille réelle.

Projection avec paramètres de base

Le cadre jaune qui apparaît autour du Projector indique les limites d'action du Projector. Dans mon exemple, cet cadre touche le mur du fond qui reçoit donc la projection. Cependant, la texture en déborde et est projetée à l'infini sur toute la surface tant qu'elle rentre au moins partiellement dans ce cadre. Si l'on donne au Projector une rotation qui fait entrer plusieurs surfaces dans son champ de vision, toute surface touchée est intégralement recouverte.

Projection sur plusieurs surfaces

Afin de limiter la projection au cadre jaune qui indique la limite de la projection, il faut régler sur vrai le paramètre bClipBSP.

Projection avec bClipBSP réglé sur vrai

Là encore, l'image dépasse du cadre en s'affichant en losange. Il s'agit d'un dysfonctionnement du Projector dû au champ de vision, le FOV, qui est par défaut réglé à 0. En changeant le FOV pour n'importe quelle valeur, un cadre cyan apparaît.

Projector avec FOV supérieur à 0

Ce cadre cyan définit exactement la façon dont la texture est projetée : au niveau du Projector, le cadre a exactement la taille de la texture. Puis cette dernière est projetée avec un angle de vue égal à la valeur spécifiée dans FOV jusqu'à la distance maximale de projection, définie par le champ MaxTraceDistance. Dans l'exemple suivant, une texture carrée de 32 unités de côté est projetée avec un FOV assez important.

Taille de la texture au niveau du projector et à sa distance maximale

Si le FOV est égal à 0, cette distance est exactement, en unités Unreal, la distance entre le Projector et l'extrémité du cadre jaune ou cyan. Cependant, à MaxTraceDistance égale, plus le FOV augmente, plus la distance maximale de projection se réduit.

Distance d'affichage selon le FOV

Si le FOV est négatif, les cadres jaune et cyan se déplacent derrière le Projector, à l'opposé de la flèche rouge qui marque sa direction et la projection ne fonctionne pas (même si les cadres englobent des surfaces).

Une fois le FOV ajusté et le clipping BSP activé, il est possible de déplacer et d'orienter à volonté le Projector. Prenez garde à ne pas utiliser CTRL + Z pour annuler une manipulation du Projector car l'éditeur plante alors presque systématiquement. Il est aussi possible de modifier la taille de la projection en modifiant le paramètre DrawScale, dans l'onglet Display des propriétés du Projector (notez que le paramètre DrawScale3D qui permet de modifier l'échelle sur chaque axe, lui, n'affecte que la taille de l'actor Projector et pas celle de la projection).

La projection est toujours carrée : si vous utilisez une texture rectangulaire, elle sera écrasée et coupée sur tous les côtés.

Projection d'une texture rectangulaire

Les Projectors étant le plus souvent utilisés pour simuler des ombres, il est possible de désactiver leur prise en compte sur les surfaces BSP dont le paramètre Unlit est coché. Pour cela, il suffit de régler bProjectOnUnlit sur faux.

Projection désactivée sur surface unlit

On constate la première limitation des Projectors : la projection se fait sur toutes les surfaces correctement orientées dans le champ de vision de l'actor. Il n'y a pas d'occlusion, "d'ombre" : si un objet se trouve dans le champ de la projection mais est entièrement masqué par un autre, il recevra néanmoins la projection à travers l'obstacle.

Projection à travers une surface

Si des static-meshes se trouvent dans l'angle de vue du Projector, la projection sera illimitée dessus si le paramètre bClipStaticMesh n'est pas réglé sur vrai. Ce paramètre est l'exact symétrique de bClipBSP. Autrement, le Projector fonctionne sur les static-meshes comme sur la géométrie avec une exception : bProjectOnUnlit ne fonctionne que sur les surfaces BSP. Un static-mesh ayant bUnlit réglé sur vrai dans l'onglet Display de ses propriétés recevra tout même les projections.

Les Projectors fonctionnent également sur les terrains mais l'image projetée a tendance à déborder de la zone de projection marquée par le cadre cyan. La projection s'affiche en effet sur la totalité de chaque triangle dont au moins une partie se trouve dans le champ de vision du Projector.

Projection sur un terrain

Cela ne pose généralement pas de problème car les Projectors sont surtout utilisés pour projeter des ombres. La majorité de la texture est alors transparente, notamment sur les bords, et le problème est masquée car les parties en surplus de la texture, qui débordent sur les triangles adjacents, sont invisibles.

Ombre d'un arbre par Projector

Néanmoins, si le motif projeté est totalement opaque (ou au moins opaque suffisamment proche du bord de la texture), ce défaut peut être un véritable problème. Il faut alors envisager d'ajouter une marge invisible à la texture ou au material utilisé pour la projection.

Enfin, sachez que joueurs, véhicules, items et même les armes du joueur dans la vue à la première personne, sont affectés par les Projectors.

Projection sur un joueur et son arme

Ces concepts de base étant posés, il est déjà possible d'utiliser le Projector pour son effet classique : la projection d'ombres détaillées ou animées.

Ombres

Le paramètre FrameBufferBlendingOp du Projector est réglé par défaut sur PB_Modulated, ce qui est parfait pour projeter une ombre.

Texture d'ombre dans DavesTexture

Les parties noires de la texture, une fois projetée, sont opaques, alors que les parties claires sont transparentes (si grises) et éclaircies (si blanches) par rapport à l'éclairage normal.

Ombre de base

Si l'on fait un dégradé du noir au blanc, la fonctionnement devient apparent.

Dégradé et opacité

Les parties noires sont totalement opaques. Les parties blanches voient leur éclairage intensifié. Entre les deux, on voit un dégradé qui culmine au gris parfait (RGB 128, 128, 128), qui est totalement transparent et n'affecte pas l'éclairage. On peut donc facilement créer une ombre en dessinant sur un champ gris un motif foncé, dont on modulera l'opacité en tendant plus ou moins vers le noir complet.

Ombre projetée avec opacitée modulée suivant la valeur de gris

La projection interagit donc avec la surface qui reçoit la projection et avec l'éclairage. On peut projeter une image noire avec un motif clair sous une lumière à faible rayon pour un éclairage très ponctuel, ou projeter un motif clair sur fond gris pour simuler non pas une ombre mais un spot de lumière plus intense.

Effets de lumière

De plus, sur l'image de gauche, les raies de lumière défilent latéralement. En effet, rien n'empêche d'utiliser une texture animée, un material ou même un shader dans un Projector. Sur l'image de droite, l'effet lumineux est jaune, car rien n'oblige à projeter une texture en niveaux de gris. Pour déterminer l'opacite ou la clarté de chaque pixel, le Projector ramène sa couleur à une valeur de gris équivalente qui sert à déterminer sa transparence.

DM-Curse4 utilise ainsi des texture grises avec des reflets d'eau clairs dans un shader animé pour simuler le jeu de la lumière avec l'eau dans le couloir inférieur.

Projectors de DM-Curse4

Paramètres

La liste des paramètres du Projector est relativement longue et permet d'ajuster le comportement de la projection en fonction de l'environnement.

Opacité diminuant avec la distance

Détail important : l'opacité varie aussi avec l'orientation de la surface par rapport au Projector. Plus la projection est perpendiculaire, plus elle est opaque. Mais plus la surface devient parallèle à la direction du Projector, plus la projection est transparente.

Opacité diminuant avec l'angle Opacité fixe suivant l'angle malgré l'utilisation de bGradient FOV d'un Projector Blending du projector

Sur cet exemple, la texture possède un canal alpha totalement transparent sur les parties noires de la texture. À gauche, le mode PB_None ou PB_Modulated projette la texture sans prendre en compte ce canal alpha. La partie noire de la texture est opaque et la partie rouge, très saturée, est légèrement transparente (on peut voir le grain de la texture du mur à travers le rouge). Au mileu, PB_AlphaBlend suit les données du canal alpha : la partie noire est donc insivible et la partie rouge totalement opaque. Enfin, à droite, PB_Add ajoute la valeur RGB de chaque pixel de la texture sur celle du mur. Le noir (RGB 0, 0, 0) est donc invisible, mais le rouge est appliqué par-dessus la couleur du mur, ce qui donne un effet lumineux mais non pas opaque.

Projection sur particules

Il est possible de faire une projection sur les particules d'un xEmitter. Cette technique ne fonctionne pas sur les particules d'un Emitter malgré la présence dans les propriétés de ce dernier de paramètres dédiés qui ne semblent pas fonctionner.

La projection sur des particules peut se voir dans DOM-Core, une des maps d'origine du jeu. Combinée au fog, elle permet de donner l'impression d'un air pollué, plein de fumée ou chargé en poussière.

Projector de DOM-Core Projector de DOM-Core

Pour ce faire, il suffit de s'assurer que le Projector a bien bProjectOnParticles = vrai (comme c'est le cas par défaut) et de modifier deux paramètres d'un xEmitter normal: bAcceptProjectors et bForceAffected doivent être vrais, respectivement dans l'onglet Display et Force. Pour que l'effet soit pris en compte, il faut que le Projector lui-même soit mis à jour après coup, ce qui peut se faire en changeant n'importe lequel de ses paramètres. Les particules du xEmitter sont alors affectées par le Projector.

Projector sur particules de xEmitter

Si la pièce est remplie de particules, on s'aperçoit rapidement qu'il n'y a pas de clipping et que la texture, même non répétée sur les static-meshes et les surfaces BSP, se répète sur les particules.

Répétition de projection sur particules

Cela se corrige dans les paramètres de la texture, en changeant les deux modes de clamping (pour les deux axes) en TC_Clamp.

Texture projetée sur particules avec TC_Clamp

Le TC_Clamp permet d'ailleurs également d'éviter la répétition sur les static-meshes et le BSP sans avoir besoin d'activer bClipBSP et bClipStaticMesh.

Rebuilder un Projector

Il est parfois nécessaire de rebuilder la map pour qu'un Projector soit mis à jour. Parfois, lorsqu'il est tourné, la projection ne change pas d'orientation avant.

Si un Projector affecte un static-mesh, un bug d'UnrealEd conduit à la superposition d'une seconde image par-dessus la première projection, ce qui entraîne une exagération de l'effet jusqu'à ce que la texture soit devenue totalement opaque. Pour comparaison, voici une image d'un Projector, à gauche, après 3 rebuilds, à côté d'un second, à droite, tout juste ajouté.

Un Projector, à gauche, rebuildé 3 fois, et un Projector normal à droite

Remarquez que la superposition de la projection n'a lieu que sur la partie de la projection de gauche qui affecte le static-mesh. La partie inférieure, sur le BSP, reste normale. Le même problème se produit sur les terrains : chaque rebuild induit une superposition d'une projection supplémentaire. Toutefois, dans les deux cas, il s'agit d'un bug d'affichage qui n'affecte qu'UnrealEd. En jeu, la projection apparaît normalement. De plus, il suffit de recharger la map dans l'éditeur pour que tout Projector soit réinitialisé.

© 2005-2025, by Hellkeeper.

Valid XHTML 1.1 & CSS 3