Terrains
Introduction
Avec les static-meshes, l'éditeur de terrains est sans doute la plus grosse avancée entre l'Unreal Engine 1 et l'Unreal Engine 2. Il permet de créer des terrains de très grande taille sans avoir besoin d'éditer à la main le brush terrain et n'est pas soumis aux inconvénients de la géométrie BSP. Les terrains créés avec cet outil ne peuvent pas engendrer de trous BSP et peuvent être composés de centaines de polygones pour un résultat lisse et naturel, là où les précédentes versions devaient se contenter de terrains schématiques, souvent étroits et anguleux.
Les terrains d'Unreal 2, un des pemiers jeux à implémenter l'éditeur de terrains, sont ainsi spectaculaires par rapport à ceux d'Unreal et d'UT99.
Principe
Un terrain est stocké sous la forme d'une texture en niveaux de gris 16 bits, appelée heightmap, qui est interprétée par un actor TerrainInfo comme une carte topographique. Chaque pixel représente l'altitude d'un point du terrain sous la forme d'une nuance de gris allant du noir (l'altitude minimale possible) au blanc pur (l'altitude maximale). La TerrainInfo projette autour d'elle une nappe de polygones, des triangles regroupés deux à deux pour former des carrés, appelés quads dans l'éditeur. Ces quads forment la plus petite unité du terrain.
Chaque pixel de l'heightmap correspond à un vertex du terrain. La taille de l'heightmap en pixels est donc le nombre de quads par côté du terrain (qui est forcément un quadrilatère). La taille des quads est paramétrable. Une heightmap de 256 pixels de côté utilisée pour générer un terrain dont les quads font 64 unités de long (ce sont les mesures par défaut) mesure ainsi 256 x 64 = 16384 unités.
Un terrain est toujours considéré par le jeu comme un sol (ou un plafond, comme expliqué plus loin) et il est donc impossible de réaliser un wall-dodge en prenant appui sur une paroi du terrain ou d'utiliser une pente comme rampe pour accéder à étage avec une esquive, comme avec les planches inclinées de DM-Rankin.
Création du terrain
Un terrain doit être contenu dans une zone régie par une ZoneInfo dont le paramètre bTerrainZone est vrai. S'il s'étend sur plusieurs zones, toutes doivent contenir une ZoneInfo (ou un dérivé, tel qu'une SkyZoneInfo), avec ce paramètre activé. Un terrain doit être entièrement contenu dans une seule zone.
Les parties du terrain se trouvant dans une zone différente de la TerrainInfo seront dépourvues de collision et ne recevront pas le même éclarairage. De plus, ces portions du terrain seront invisibles hors de la zone de la TerrainInfo.
Une fois la zone réglée, le terrain peut être intégralement créé, sculpté et texturé depuis l'éditeur de terrains, accessible dans la barre d'outil de gauche par l'outil Terrain Editing, qui utilise l'icône de montagnes.
Cette icône correspondait, dans l'Unreal Engine 1, au brush terrain (un cube à la face inférieur subdivisée). L'icône a été réutilisée pour l'éditeur de terrains et le brush terrain utilise une nouvelle icône.
L'éditeur de terrains s'ouvre dans une nouvelle fenêtre, vierge par défaut. La partie supérieure de l'interface n'est pas utile tant qu'un terrain n'a pas été créé dans la partie inférieure. En bas, trois onglets permettent de gérer les différents composants du terrain : Terrains, Layers et Decorations.
Dans le coin inférieur gauche de l'onglet Terrains, le bouton portant une icône de page blanche permet de créer un nouveau terrain (une nouvelle heightmap). La fenêtre de création ressemble à celle utilisée pour définir l'emplacement d'une nouvelle texture.
- Package, Group et Name : Comme pour toute création ou importation, ces champs permettent de définir où stocker l'heightmap et sous quel nom. MyLevel est le package le plus souvent utilisé.
- XSize et YSize : Ces deux paramètres définissent la taille de la texture créée pour servir d'heightmap, donc le nombre de quads sur chaque côté. La même contrainte que pour les autres textures s'applique : ces dimensions doivent être des puissances de 2. Les deux valeurs n'ont pas besoin d'être égales et avoir un côté plus long que l'autre donnera un terrain rectangulaire au lieu d'un carré.
Par défaut, un quad mesurant 64 unités de côté, la taille de l'heightmap doit être la taille de la zone à couvrir divisée par 64. Ainsi, pour remplir une zone de 4096 unités de côté, l'heightmap devra mesure 4096 / 64 = 64 unités de côté. - Height : Couleur par défaut de l'heightmap et donc altitude par défaut du terrain. Ce champ peut contenir n'importe quel nombre entre 0 (noir) et 65535 (blanc). Par défaut, ce champ est réglé sur 32768, exactement à la moitié de l'intervalle possible, ce qui donne un gris parfaitement moyen.
Une fois l'heightmap créée, un actor TerrainInfo est automatiquement créé à l'emplacement de la caméra de la vue 3D, utilisant la même icône que l'outil Terrain Editing dans la barre d'outils d'UnrealEd.
Le terrain n'est pas visible avant un rebuild. Il apparaît alors dans la vue Wireframe mais pas encore dans les autres modes de rendu car il ne possède pas encore de textures. Bien qu'invisible, il est néanmoins pourvu d'une collision et il est possible de se déplacer dessus dans le jeu si la map est testée.
Si Height a été laissé à 32768, le terrain se trouve exactement à l'altitude de la TerrainInfo. Autrement, il se trouve au-dessus ou au-dessous, décalé d'autant d'unités qu'il y a d'écart avec 32768.
Afin de rendre le terrain visible, il est nécessaire d'ajouter une texture de base au terrain à l'aide d'un layer. Ce dernier est composé d'une texture et d'une AlphaMap, un masque de transparence qui définit sur quels polygones du terrain la texture est plus ou moins visible.
Après avoir sélectionné une texture appropriée dans le texture browser (par exemple dans le package ArboreaTerrain.utx), il faut se rendre dans le second onglet de la partie inférieure de l'éditeur de terrains.
Le bouton New permet de créer un layer avec la texture sélectionnée. Il faut pour cela avoir d'abord cliqué sur l'une des bandes rouges marquées "Undefined". Les layers s'affichent les uns sur le terrain en respectant l'ordre dans lequel ils sont listés : ceux situés plus bas recouvrent les layers situés plus dans la pile. La première texture doit donc être ajoutée au premier emplacement, au sommet de la hiérarchie. La fenêtre de création de layer est remarquablement similaire à celle de création d'heightmap, avec quelques paramètres en plus.
- AlphaHeight et AlphaWidth : Ces deux paramètres indiquent la taille de l'AlphaMap du layer. Les dimensions doivent être les mêmes que les valeurs XSize et YSize de l'heightmap. Des dimensions différentes engendrent des artefacts d'affichage.
- AlphaFill : Définit l'opacité par défaut de l'AlphaMap, et donc de la texture, par rapport à celles placées au-dessus d'elle dans la pile. La texture étant ensuite appliquée ou retirée manuellement, il ne s'agit que de la transparence par défaut, qui est presque toujours modifiée après.
- ColorFill : Définit la couleur de l'AlphaMap. La seule utilité de ce paramètre peut être de rendre les layers identifiables au premier coup d'œil dans le texture browser.
- UScale et VScale : Échelle par défaut de la texture, définie par rapport à chaque quad du terrain. Si la valeur est 1 dans les deux champs, la texture (indépendamment de sa taille) couvre exactement 1 quad. Si la valeur est 2, la texture est étirée pour couvrir un carré de 2 quads de côté. Les deux nombres peuvent être différents et les valeurs décimales sont acceptées.
La première texture utilisée est généralement la texture de base du sol et doit donc couvrir la totalité du terrain. Son opacité doit donc être maximale, ce qui est le cas si l'AlphaFill est blanc. Le champ A peut être ignoré totalement, mais les champs R, G et B doivent donc être réglés sur la valeur maximale, 255. Avec les dimensions réglées sur celles de l'heightmap, un nom et un package, le layer peut être créé et le terrain devient alors visible.
Une fois le terrain généré et visible, il est possible de commencer à le travailler. Afin de pouvoir visualiser sa forme facilement, il est toutefois préférable d'ajouter d'abord un éclairage basique, de préférence une Sunlight, qui nécessite que le terrain soit exposé à des faces en Fake Backdrop (c'est généralement le cas du brush de grande taille qui entoure le terrain). La portée infinie de la Sunlight permet d'éclairer tout le terrain à la fois. Les ombres rendent alors visibles les volumes au fur et à mesure que le paysage est sculpté.
Notez qu'il est également possible d'importer une heightmap depuis un logiciel externe. C'est d'ailleurs la seule façon de procéder dans Unreal 2, car la version d'UnrealEd de ce dernier est moins avancée. La technique détaillée dans le tutorial dédié à Unreal 2 est donc utilisable également avec UT2004.
Paramètres de l'actor TerrainInfo
Avant de s'intéresser à la mise en forme du terrain, il est utile de s'arrêter sur la TerrainInfo. Le terrain est projeté autour de cet actor (un dérivé de la classe Info, comme la ZoneInfo) et déplacer la TerrainInfo déplace donc le terrain avec. Cet actor possède quelques paramètres permettant de changer radicalement l'apparence du terrain.
- bKCollisionHalfRes : Ce paramètre mineur permet d'utiliser une collision simplifiée pour le terrain pour son interaction avec les objets physiques.
- Inverted : En réglant ce paramètre sur vrai, le terrain, qui est par défaut un sol, est inversé et devient donc un plafond. Par défaut, les polygones du terrain ne sont visibles et n'ont de collision que sur leur face supérieure. Inverted permet de les afficher et de placer leur collision sur la face inférieure. Cette fonction est utile pour créer des cavernes en utilisant un terrain pour le sol et un autre pour le plafond de la grotte, technique notamment utilisée dans la map DM-CBP1-Neandertalus.
- TerrainMap : Il s'agit de l'heightmap, qui peut donc être changée tout en conservant les autres paramètres du terrain (layers et decolayers notamment).
- TerrainScale : L'échelle du terrain, correspondant pour X et Y à la taille des quads (qui peuvent être des rectangles si les deux mesures ne sont pas exactes) et pour Z à l'échelle verticale du terrain. Pour ce qui est de l'axe Z, un terrain ne peut pas s'étirer à plus de 8192 unités au-dessus ou au-dessous de la TerrainInfo avec TerrainScale Z = 64. Augmenter ou diminuer cette valeur permet d'augmenter les altitudes minimales et maximales.
Les valeurs peuvent également être négatives pour retourner le terrain en miroir. Cette fonction est utilisée par exemple dans CTF-MoonDragon : les deux parties de la map étant symétriques, la même heightmap est utilisée pour les deux côtés, mais la base bleue utilise des valeurs négatives pour les axes X et Y du TerrainScale. Avec une valeur négative sur l'axe Z, les altitudes sont inversées : tout creux devient une bosse et inversement. - TerrainSectorSize : Cette propriété définit la taille d'un secteur du terrain. Tout le terrain est divisé en secteurs carrés donc la longueur en quads est spécifiée par ce paramètre. Il s'agit d'un moyen d'optimisation important.
- VertexLightMap : Il est possible d'ajouter dans ce champ une texture de la même taille que l'heightmap (et au format RGBA8) pour l'utiliser comme un lightmap. Le terrain ignore alors toutes les autres sources d'ombre et de lumière.
TerrainScale est, avec les dimensions de l'heightmap, l'élément qui définit la taille finale du terrain dans le jeu : un TerrainScale plus élevé permet de couvrir plus de superficie avec autant de quads ou d'utiliser moins de quads pour la même superficie. ONS-Torlan utilise ainsi un TerrainScale de 320 sur X et Y, ce qui donne des quads relativement grands et permet d'occuper un carré de 44545 unités de côté avec une heightmap de 128 x 128. Avec des quads de 64, l'heightmap aurait dû mesurer 1024 pixels de côté et une bonne partie serait restée inutilisée. Plus important encore, une heightmap de 128 unités de côté génère un terrain de 16384 quads alors qu'une heightmap de 1024 unités de côté aboutit à un terrain de plus d'un million de quads.
Modelage du terrain
En passant le pointeur sur le sol avec l'éditeur de terrains ouvert, deux cercles jaunes se déplacent sur la surface, centrés sur un marqueur rouge sous la souris.
Il s'agit du pinceau, qui s'ajuste avec la partie Options de l'éditeur.
- Inner Radius et Outer Radius : Définissent la taille des deux cercles jaunes : Inner est le plus petit et Outer le plus grand. Les deux valeurs s'ajustent séparémment, mais en activant le cadenas à droite, il est possible de verrouiller l'écart entre les deux. Déplacer le slider du rayon supérieur entraîne alors celui du rayon inférieur qui n'est plus modifiable indépendamment.
- Strength : Puissance de l'outil utilisé.
- Adjust : Modifie également la puissance de l'outil en conjonction avec Strength.
Par défaut, les réglages du pinceau sont globaux. Cocher la case "Per Tool?" au-dessus des réglages réinitialise toute modification et permet de le paramétrer différemment pour chaque outil.
Certains outils n'utilisent qu'un seul cercle du pinceau (Flatten, Smoothing, Noise, Visibility). C'est alors le Outer Radius qui est pris en compte.
Si la map doit être symétrique, plutôt que de réaliser péniblement deux moitiés de terrain identiques, on peut créer un miroir du pinceau avec le menu défilant marqué Mirror. On peut y choisir d'utiliser un miroir sur X ou Y (respectivement droite-gauche ou haut-bas dans la vue de dessus) ou les deux à la fois avec le miroir XY (il y a alors 4 pinceaux). Toute action effectuée sur le terrain est alors reproduite de l'autre côté du miroir.
En appuyant sur la touche T, on peut afficher et masquer le terrain. Ce raccourci fonctionne dans les vues 2D et il est alors possible d'utiliser l'éditeur de terrains dans ces vues, ce qui est particulièrement utile avec la vue de dessus.
Le pinceau est le principal outil permettant de modifier le terrain, aussi bien pour créer les reliefs que pour appliquer les textures et les décorations. Les effets sont différents suivant que l'on utilise les outils de l'éditeur en ayant sélectionné une heightmap dans l'onglet Terrains, un layer dans l'onglet Layers ou un decolayer dans l'onglet Decorations. Pour sculpter les reliefs, il faut sélectionner l'heightmap.
L'utilisation des outils se fait ensuite en appuyant sur Ctrl et en cliquant tout en déplaçant la souris sur la surface à traiter. Notez que comme l'heightmap ne fournit que des données d'altitude, le terrain ne peut pas comporter de surplomb : les vertices qui le composent ne peuvent être déplacés que verticalement et jamais horizontalement.
Vertex Editing
L'outil Vertex Editing permet de sélectionner des vertices en appuyant sur la touche Ctrl et en cliquant sur le terrain. Les vertices compris dans le pinceau sont sélectionnés. Une fois la sélection faite, garder les deux boutons de la souris et la touche Ctrl enfoncés permet de déplacer les vertices sélectionnés vers le haut ou vers le bas en déplaçant la souris vers l'avant ou l'arrière.
Les vertices compris à l'intérieur du Inner Radius sont déplaces avec la force maximale et sont donc signalés par des marqueurs clairs (blancs si Strength = 100). Ces marqueurs deviennent plus sombres entre le rayon inférieur et le rayon supérieur et la force de l'outil diminue avec le changement de couleur, ce qui permet de réaliser un effet progressif.
La sélection peut-être étendue en cliquant sur le bouton "Select" sous Soft Selection, à droite des réglages du pinceau. La case à cocher "Automatic?" est dépourvue d'effet, tout comme le bouton "Undo" en dessous. Il n'est malheureusement pas possible d'annuler une action de modélisation dans l'éditeur de terrains.
Painting
L'outil Painting permet de littéralement peindre du relief sur le terrain en passant le pinceau sur la surface en appuyant sur Ctrl et le bouton gauche de la souris pour peindre des bosses, le bouton droit pour peindre des creux. L'effet est très puissant et Strength et/ou Adjust doivent donc être assez faibles.
Smoothing
Smoothing lisse les reliefs pour les adoucir. Les reliefs abrupts sont lissés et les extrêmes de hauteur sont ramenés vers la moyenne.
Passer le smoothing sur les bords du terrain génère des aberrations, il est donc recommandé de se tenir à l'écart des extrémités.
Noise
À l'inverse du smoothing, l'outil Noise ajoute du bruit sous le pinceau. Chaque vertex reçoit une variation de hauteur aléatoire.
Flatten
Flatten permet d'égaliser la surface sur laquelle le pinceau est passé. La hauteur à laquelle est aplatie le terrain est déterminée par la hauteur du vertex unique situé sous le marqueur rouge au moment où Ctrl et le clic gauche sont enfoncés, et ce quel que soit le rayon du pinceau.
Visibility
L'outil Visibility masque les quads sur lesquels il est passé avec Ctrl et le bouton droit de la souris enfoncés. Avec Ctrl et le clic gauche, on peut rendre à nouveau visibles les quads précédemment masqués.
Les quads masqués ne sont pas seulement invisibles : ils perdent aussi toute collision. L'outil permet donc de créer des ouvertures dans le terrain, permettant d'y ajouter des trous ou des entrées.
En vue Wireframe, on peut d'ailleurs constater que les quads ne sont pas seulement rendus invisibles : ils sont réellement retirés du terrain.
Edge Turn
Edge Turn permet de changer l'orientation de l'arête centrale qui divise les quads en deux triangles.
L'effet peut être peint sur les quads que l'on souhaite retourner pour ne cibler que des zones précises. Ctrl + clic droit permet de remettre les quads dans le sens d'origine.
Cette modification est utile lorsque des reliefs trop marqués occasionnent un effet de dents à cause de la découpe des polygones.
Note que si l'outil Edge Turn est sélectionné, un seul quad sous le pinceau est mis en valeur et le rayon n'est pas affiché. L'effet de l'outil s'applique cependant bien sur la totalité de la surface englobée dans l'Outer Radius.
Select
L'outil Select permet de sélectionner une zone rectangulaire du terrain. Ctrl + clic gauche permet de tracer un cadre en cliquant sur un coin de la zone à sélectionner et en l'étendant autant que voulu.
Ctrl + clic droit fonctionne de la même façon, mais au lieu de tracer un cadre depuis le point de départ du curseur jusqu'à son point d'arrivée, le cadre de sélection est tracé entre le point de départ de la dernière sélection et l'endroit où se trouve le curseur (si aucune sélection n'a déjà été faite, le point de départ est le centre exact du terrain).
L'outil n'a pas d'effet en soi mais s'utilise conjointement avec l'onglet "Misc." de l'éditeur, qui est un générateur automatique de relief.
Cet outil génère des bosses et des creux aléatoires sur la surface.
- Steps : Ce nombre paramètre la taille des reliefs aléatoires générés : plus la valeur est basse, plus les effets seront de grande taille et peu nombreux. On peut grossièrement y voir le nombre de touches apportées par l'outil sur la longueur et la largeur de l'heightmap.
- Strength : Force de l'outil. Détermine la profondeur des creux et la hauteur des sommets générés.
- Use Entire Heightmap? : Permet de générer le relief sur la totalité de l'heightmap, pas seulement sur la zone sélectionnée. Il n'est alors même pas besoin de sélectionner une section du terrain, mais l'outil Select doit tout de même être activé.
Avec une valeur élevée dans Steps et une basse valeur de Strength, et en appliquant l'effet sur toute l'heightmap, on peut créer un paysage dunaire.
À l'inverse, la combinaison d'une Strength élevée et d'un Steps bas donne de profondes vallées entre quelques hautes montagnes.
Si une zone de sélection est utilisée, la valeur de Steps n'est pas appliquée au cadre de sélection mais, virtuellement à toute l'heightmap, et seule la partie sélectionnée est réellement prise en compte. De plus, le générateur tente de garder des reliefs relativement lisses et d'éviter les pentes trop abruptes. En conséquence, si un cadre de sélection est utilisé, à effet équivalent, les valeurs de Steps et de Strength devront être beaucoup plus élevées que si le générateur était appliqué à toute l'heightmap.
Les trois derniers outils, Tex Pan, Tex Rotate et Tex Scale, n'ont aucun effet sur l'heightmap.
Textures et layers
L'application de textures sur le terrain se fait par l'ajout de layers successifs dans l'onglet Layers de l'éditeur de terrains. Le premier layer est totalement opaque et permet de couvrir la totalité de la surface du sol. Les layers successifs sont généralement ajoutés avec un paramétrage qui les rend invisibles par défaut, puis appliqués au pinceau sur les zones voulues. L'ordre est important car plusieurs layers peuvent être superposés sur un même quad, auquel cas ils sont appliqués dans l'ordre, du premier au dernier, les plus bas recouvrant donc ceux au-dessus mais étant eux-mêmes recouverts par ceux placés dessous.
En plus de la liste des layers elle-même, l'onglet possède quelques boutons.
Les boutons New, Delete et Duplicate permettent d'ajouter, de supprimer ou de dupliquer un layer. Les deux flèches vers le haut et le bas remontent ou descendent le layer actuellement sélectionné dans la liste afin d'ajuster l'ordre d'application. Le dernier bouton à droite, portant le schéma d'un quad, permet de mettre en valeur le maillage des quads portant les textures cochées dans la liste qui s'affiche.
L'intérêt est de s'assurer que de trop nombreuses textures ne s'empilent pas sur les mêmes triangles. Si plusieurs layers recouvrent le même triangle, celui-ci doit en effet être dessiné à l'écran plusieurs fois, chaque nouvelle passe recouvrant la précédente.
Après la première texture, dont l'AlphaMap est blanche, on peut ajouter de nouveaux layers jusqu'à en un maximum de 32. Pour toutes, les dimensions de l'AlphaMap doivent être les mêmes que celles de l'heightmap. Autrement, la texture ne s'affiche pas correctement : en pointillés si le layer est plus grand que l'heightmap, en gros blocs aux bords visibles si le layer est de dimensions inférieures.
Lors de la création d'un nouveau layer, en créant une AlphaMap totalement noire (R, G et B = 0) on s'assure que la texture n'est appliquée nulle part pour pouvoir l'ajouter manuellement aux endroits voulus.
On peut à tout moment changer la texture d'un layer en en sélectionnant une dans le texture browser, puis en faisant un clic droit sur le layer et en choisissant "Set Texture from Current".
On peut aussi changer l'AlphaMap en choisissant celle voulue et en cliquant sur "Set Alpha from Current". L'option "Toggle Grid" a le même effet que cocher le layer dans la liste du bouton représentant un quad.
Les outils utilisés pour sculpter le terrain se comportent différemment lorsque c'est non pas l'heightmap mais un layer qui est sélectionné, à l'exception des outils qui ne servent qu'à modifier la forme du terrain. Flatten ne fonctionne pas du tout si l'heightmap n'est pas sélectionnée. Vertex Editing, Visibility, Edge Turn et Select affectent le relief dans tous les cas.
Painting
L'outil Painting est le plus important car il permet d'appliquer la texture du layer sélectionné en passant le pinceau sur le terrain avec Ctrl + clic gauche enfoncés. Ctrl + clic droit permet au contraire d'effacer la texture là où elle est déjà appliquée.
Il est même possible d'effacer la texture du premier layer, mais le terrain devient alors invisible par secteurs entiers.
Effacer la texture de base est utile lorsque des secteurs entiers sont recouverts par d'autres texture. Partout où plusieurs layers sont superposés, le jeu doit afficher les triangles du terrain autant de fois qu'il y a de layers différents empilés dessus. Si, par exemple, une vaste zone de neige ne laisse nulle part voir la texture d'herbe ou de roche du premier layer, effacer ce dernier économise des ressources.
Malgré leur invisibilité, les polygones du terrain qui ne portent aucune texture restent solides et bloquent le passage, contrairement à ceux effacés avec l'outil Visibility, qui permet de réellement trouer le terrain.
Smoothing
Smoothing permet de rendre plus douces les transitions entre les textures en étendant la distance de fondu du layer actuellement sélectionné. L'effet peut être utile mais il ne doit pas être utilisé de façon indiscriminée car il cause une forte augmentation de nombre de polygones où plusieurs layers se recouvrent et donc du nombre de polygones à afficher plusieurs fois de suite par le moteur du jeu. De plus, la superposition de textures peut avoir un rendu un peu étrange.
Noise
Utilisé sur l'heightmap pour ajouter des variations aléatoires de hauteur, l'outil Noise permet, utilisé avec un layer, d'ajouter des taches aléatoires du layer sous le pinceau.
Tex Pan, Tex Rotate et Tex Scale
Ces trois outils ne fonctionnent qu'avec un layer sélectionné. Ils permettent respectivement de décaler la texture, de changer son orientation et de la redimensionner.
Layer dans la TerrainInfo
Certains des outils de l'éditeur de terrains permettent de modifier visuellement des propriétés accessibles dans la TerrainInfo elle-même. Ses propriétés comportent une liste, Layers, dont chaque item est un layer accompagné de ses propriétés, dont certaines ne sont pas accessibles ailleurs dans l'éditeur.
Il est possible d'ajouter manuellement des layers directement dans les propriétés de la TerrainInfo. Ils apparaîtront alors dans l'éditeur de terrains qui ne fait que lire cette liste et ses propriétés.
- AlphaMap et Texture : Contiennent la référence à l'AlphaMap et à la texture du layer, qui peuvent être changées à tout moment.
- LayerRotation : Permet de changer la direction dans laquelle le plan est projeté.
- TextureMapAxis : Permet de définir parallèlement à quel plan la texture est projetée. Par défaut, la texture est projetée parallèlement au plan XY (avec TEXMAPAXIS_XY), qui est le plan horizontal. La texture est donc parfaitement plate sur le sol et se déforme lorsque les quads s'étirent verticalement. Avec TEXMAPAXIS_XZ et TEXMAPAXIS_YZ, la texture peut être projetée verticalement, parallèlement aux plans correspondants, ce qui est utile lorsqu'un layer est appliqué sur une falaise très verticale.
- TextureRotation : La rotation appliquée à la texture. C'est l'angle affecté par l'outil Tex Rotate.
- UPan et VPan : Il s'agit du décalage de la texture. Ces propriétés sont celles affectées par l'outil Tex Pan.
- UScale et VScale : L'échelle de la texture. Valeurs modifiées par l'outil Tex Scale.
L'interaction entre les paramètres TextureMapAxis, TextureRotation et LayerRotation n'est pas immédiatement intuitive. La texture est projetée sur le terrain de façon planaire (comme lorsque l'alignement Planar est utilisé dans les propriétés d'une surface BSP). Ce plan est définit par l'axe choisi dans TextureMapAxis. Pour projeter selon un angle qui ne soit pas parfaitement aligné sur la grille, LayerRotation peut être modifié et change le plan de rotation par rapport à cet axe. Enfin, sur le plan de la projection, la texture peut subir une rotation avec TextureRotation.
Le schéma ci-dessus montre en blanc les trois plans de projection. Avec TEXMAPAXIS_XY, la projection se fait à plat sur le plan horizontal, par exemple. LayerRotation, en rouge, permet de dévier par rapport au plan choisi. Enfin, la texture peut subir une rotation autour de ce plan de projection final avec TextureRotation, ici en vert.
Les paramètres KFriction et KRestitution sont des propriétés physiques utilisées pour les collisions du layer avec les objets physique. Le premier détermine la friction appliquée aux objets (la force du freinage qui leur est imposé lorsqu'ils se déplacent sur le layer), le second influence la restitution du mouvement, c'est-à-dire la force des rebonds causés par la collision avec ce layer. Ces paramètres n'ont généralement pas besoin d'être modifiés.
Derniers ajustements
Avec les outils de l'éditeur de terrains, il est ainsi possible de créer un terrain vierge, de le sculpter et de le texturer comme voulu avant d'y disposer les static-meshes, brushes et autres objets nécessaires au jeu. Si des modifications doivent apportées à la topographie après que tous ces éléments aient été placés, tout actor ajouté à la map possède, dans l'onglet Collision de ses propriétés, le paramètre bAutoAlignToTerrain. Si ce paramètre est vrai et que l'actor se trouve à la verticale du terrain (aussi bien dessus que dessous), il se déplacera vers le haut ou le bas en même temps que le quad sur lequel il est positionné.
Il reste possible de déplacer les actors ou la TerrainInfo de façon libre : seule la modification du relief a cet effet. À ce propos, notez qu'un terrain ne peut pas être tourné en faisant subir une rotation à la TerrainInfo : il est toujours parfaitement aligné sur la grille.
Éclairage
L'éclairage des terrains se fait sur le même modèle que celui des static-meshes (en faisant la moyenne de la lumière sur chaque vertex de chaque triangle), mais de façon simplifiée : la quantité de lumière reçue par un triangle du terrain est liée à son orientation par rapport à la source de lumière seulement. En conséquence, s'il peut recevoir les ombres des objets (brushes, static-meshes, etc.), le terrain ne reçoit pas d'ombre de lui-même : si un gouffre profond fait face à la Sunlight, la face orientée vers la lumière sera éclairée à pleine puissance, même si l'autre face du ravin devrait projeter une ombre dessus.
Cet effet est suffisant dans la plupart des cas, car il permet de simuler la radiosité des surfaces, mais l'approximation peut devenir flagrante lorsque des zones qui devraient clairement être à l'ombre sont éclairées, ou lorsque d'autres objets (BSP, static-meshes) reçoivent l'ombre du terrain alors que les quads autour d'eux restent lumineux.
Il peut donc être nécessaire d'ajouter une brush derrière les polygones du terrain afin que celui-ci masque la source de lumière et pour qu'une ombre soit effectivement projetée sur le terrain. Un tel cas est présent dans BR-Riveting, car le pont central de la map reçoit l'ombre d'un des deux pics rocheux alors que le terrain autour reste beaucoup plus ensoleillé.
L'ajout d'un morceau de géométrie dans la montagne permet d'avoir un ombrage cohérent sur le terrain et la géométrie.
Enfin, le lightmap du terrain étant basique (même lorsqu'un lightmap peint à la main est utilisé avec la propriété VertexLightMap), il n'est pas possible de réaliser des ombres détaillées. La seule façon d'y parvenir est d'utiliser des Projectors.
Optimisation
Les terrains sont le plus souvent de grandes zones ouvertes et ne peuvent pas être zonés. Même simple, ils sont composé de centaines de triangles. Il est donc capital, pour ne pas oblitérer les performances, de contrôler la partie du terrain qui s'affiche à chaque instant.
Comme vu plus haut, le terrain est divisé en secteurs de taille définie par le paramètre TerrainSectorSize. Tant qu'au moins un quad d'un secteur est visible, le secteur entier est affiché (cela évite de tester individuellement chaque quad). Tout l'enjeu de l'optimisation d'un terrain est donc d'afficher aussi peu de secteurs que possible à chaque instant. La visibilité n'est pas calculée par rapport à ce que le joueur peut réellement voir de son point de vue, cependant : un objet est considéré comme visible si son affichage n'est pas expressément interdit.
Le premier moyen d'y parvenir est d'utiliser un brouillard avec bClearToFog = vrai. Ainsi, tout secteur entièrement masqué par le brouillard est ignoré. Si le brouillard est léger ou lointain, la technique est peu efficace car peu de secteurs sont entièrement masqués à chaque instant. Au contraire, un brouillard au réglage agressif restreint fortement la distance d'affichage mais permet d'ignorer plus de secteurs et a donc un effet positif sur les performances. C'est la raison pour laquelle la plupart des maps du mode Onslaught sont noyées dans une épaisse purée de pois.
La deuxième méthode est d'utiliser des antiportals. Ces brushes empêchent l'affichage de tout objet qu'ils cachent entièrement, y compris les secteurs de terrain qu'ils masquent. Les antiportals sont généralement insérés à l'intérieur des collines les plus importantes ou derrière les falaises pour masquer des portions aussi grandes que possible du terrain. Un excellent exemple est BR-Colossus : un antiportal gigantesque coupe la map en deux à l'intérieur du mur central sur lequel se trouve la balle. Depuis l'un des côtés, la base adverse est entièrement masquée, ce qui permet d'éviter l'affichage de la moitié du terrain.
Bien entendu, l'utilisation des zones fonctionne aussi : si le joueur se trouve par exemple dans une zone séparée et ne peut voir qu'une partie du terrain à travers un portal, les secteurs non visibles ne sont pas affichés. Dans BR-Riveting, les intérieurs de chaque base sont des zones séparées. Tant que le joueur reste dedans et ne regarde pas vers l'extérieur à travers un portal, aucun polygone du terrain n'est donc calculé.
RSS Feed