CONTENU

Les Hints

Ce tutorial porte sur "les Hint Brush"
Cette page dispose d'une feuille de style pour l'impression (afin de supprimer la mise en page du site).
Dernière mise à jour le 24/08/2013.

Ce cours a été entièrement écrit par moi, c'est à dire NykO18.
Pour me contacter, plusieurs moyens :

Creative Commons License Cette création est mise à disposition
sous un contrat Creative Commons.

Plan

I. Introduction

Dans ce tutorial, je vais essayer de vous faire comprendre une bonne fois pour toute ce qu'est un "hint", à quoi cela sert et comment s'en servir (surtout) Je vois beaucoup trop de gens dire n'importe quoi sur les hints ou se vanter de les "maîtriser" sans même réellement savoir ce que c'est ! Pour bien comprendre les hints, je vais rapidement (mais pas vainement) revenir sur le fonctionnement de BSP et VIS durant la compilation ainsi que leurs rôles respectifs.

Je ne vous cache pas que les hints sont une notion bien souvent très mal comprise, car très "abstraite" et sûrement trop pour certaines personnes.. Comme je le mentionnais dans un autre tutorial de ma conception, utiliser les hints requiert relativement peu de choses, à part un brin de logique, pas mal de facilité à "visualiser et se repérer dans un espace en 3 dimensions" et également du temps et de la patience..

II. BSP et VIS

Pour faciliter la compréhension de ce tutorial, je vais prendre pour référence une map, ou plutôt un bout d'une map, que j'ai réalisée et sur laquelle je me suis rendu compte que les hints étaient vraiment utiles. Ce bout de map représente un immeuble, tout du moins quelques étages d'un immeuble. Le plan de chaque étage est le même, et il est relativement simple :

Plan d'un étage Une cage d'ascenseur et un escalier situés à peu près au milieu du batiment. Puis un couloir (palier) en "U" qui dessert tous les appartements de chaque étage. Chaque appartement possède une seule et unique ouverture vers ce palier (la porte d'entrée) et il est impossible de sortir autrement que par là. (les fenêtres sont incassables)

Le problème majeur de ce type d'architecture est que depuis le palier, il est pratiquement possible de voir tous les appartements.. Je pourrais mettre des func_areaportal à chaque porte d'appartement pour limiter la visibilité, mais pour une map multijoueurs, cela serait trop gourmand.. et à la limite, même pour une map solo, étant donné le nombre d'étages et d'appartements par étage. Bref, toujours est-il que, lorsque BSP va découper cette map, il devrait "normalement" procéder ainsi :

Découpes d'un étage Comme on le voudrait, BSP devrait découper notre étage en salles.. une pour chaque appartement, 3 pour former le couloir, une pour la cage ascenseur et une pour la cage d'escalier.. Ca parait au fond tout à fait logique ! Et sans même parler ici d'optimisation

De cette façon, lorsque la compilation passe à VIS, ce dernier n'a plus qu'à prendre chaque pièce une par une et regarder quelles pièces sont visibles de chacune des autres. De cette façon, une fois dans le jeu, le moteur ne s'embêtera pas à calculer les pièces invisibles. Si on prend notre plan ci-contre :

* On ne peut pas voir la pièce 1 depuis la pièce 2, mais par contre on peut la voir depuis la pièce 3 par l'ouverture de la porte.
* On ne peut pas voir la pièce 2 depuis la 1 ou même la 3. La cage d'ascenseur et l'escalier bloquent totalement la visibilité.
* On peut uniquement voir la pièce 3 depuis la pièce 1.

Tout cela pour dire qu'une découpe parfaitement effectuée par BSP est la clef de l'optimisation.
Car nous allons vite voir qu'une découpe bordélique va vite devenir une horreur.

III. BSP tu déconnes ?

Comme tous les logiciels, comme tous les programmes, comme tout ce qui touche à l'informatique.. BSP n'est pas infaillible, loin de là.. Après tout, ce n'est qu'un vulgaire programme qui tente de deviner "où sont vos pièces et de quelle forme elles sont".. Et vous savez très bien que, même si pour vous il est très simple de distinguer chaque appartement d'un autre, et un appartement d'un couloir, pour BSP ce n'est pas SI évident que cela..

Je vais vous faire par de la magistrale découpe de BSP sur ce type de plan.. et vous allez voir, c'est vraiment TRÈS éloigné de ce que l'on cherchait à obtenir tout à l'heure :

III.1. Exemple 1

Découpes horribles d'un étage Voici à peu près comment BSP a compris.. ou plutôt, comment BSP n'a pas compris mon étage ! Lui, il a vu des trous dans les murs, des trous pour les portes.. malheureusement, il ne sait pas qu'il y a des portes car il ne touche pas aux entités.. Il a donc vu des trous dans les murs, et s'est dit "comme de chaque côté du couloir les portes sont les unes en face des autres, cela doit être un couloir" (caricature) et il a donc "découpé" des couloirs au beau milieu des appartements. Chaque bloc d'une même couleur est un leaf (une pièce pour BSP) et chaque bloc noir est également un leaf..

Le problème maintenant, ce n'est plus tellement BSP mais VIS.. car VIS, lui, va gentillement suivre ce que BSP lui a découpé, et va donc regarder quelle "pièce" et visible de chacune des autres.. Malheureusement, les pièces sont découpées n'importe comment, et c'est donc une vrai anarchie.. Regardez attentivement le plan, il y a une "pièce" horizontale colorée en vert sur mon schéma. Cette pièce parcourt tout l'étage de part en part en passant par le couloir et deux appartements. Maintenant imaginons que l'on se trouve dans cette pièce, n'importe où à l'intérieur (dans un appart ou dans le couloir).. Et bien pour VIS, peu importe l'endroit où vous vous trouvez, vous êtes dans la même pièce ! Ce qui signifie que vous pouvez très bien vous trouver dans l'appartement de gauche, VIS lui considère que vous êtes également en même temps dans l'appartement de droite mais aussi dans le couloir !

Comment ne pas imaginer dès lors comment il va calculer la visibilité.. Très facile pour lui, depuis cette pièce verte, on peut voir TOUS les appartements, tout le couloir, la cage d'ascenseur et aussi l'escalier ! Ce qui signifie en d'autres termes que, peu importe l'endroit où vous vous trouvez, tout l'étage sera modélisé alors qu'en fait vous ne serez pas censés en voir la moitié..

Vous voyiez bien que BSP n'est pas parfait..! Et bien sûr ce n'est qu'une exemple parmis d'autres.. Je vais d'ailleurs prendre un autre exemple tout de suite pour être bien sûr que vous avez compris !

III.2. Exemple 2

Rez-de-chaussée Nous sommes maintenant hors de l'immeuble.. sur le trotoir qui borde le rez-de-chaussée.. Par soucis de pudeur, les architectes qui ont construit cet endroit ont cru bon de surélever le rez-de-chaussée afin que les gens dehors ne puissent pas matter ce qui se passe dans les appartements du bas.. C'est une bonne idée en soit.. mais dommage que BSP ne l'entende pas de cette façon !

Et j'ai envie de dire que c'est tout à fait normal.. un simple problème de point de vue dirons-nous.. Je vais vous expliquer.

Rez-de-chaussée angles de vue Dans le jeu, une fois que nous sommes dans la peau de Gordon ou autre protagoniste, voici à peu près les angles de vue que l'on peut avoir de l'intérieur de l'appartement.. et ce depuis l'extérieur. Comme vous pouvez le voir, c'est ridicule.. on voit le plafond, et point barre.. Et selon des lois de géométrie très simples, on ne pourra absolument JAMAIS voir l'appartement "plus bas" que la ligne en pointillés rouges. Pour avoir ne serait-ce que l'équivalent du point de vue en pointillés, nous devrions nous trouver à une distance de l'immeuble égale à l'infini. On peut donc dire qu'il est impossible de voir l'intérieur de l'appartement depuis l'extérieur..

Malheureusement, ce n'est pas comme ça que BSP et VIS interprètent tout cela.. Voyons plutôt la façon dont BSP va définir les "pièces" de cet endroit..

Rez-de-chaussée découpé Voici la découpe que BSP va réaliser si tout se passe bien. (à peu près) Il y a donc une "pièce" pour l'extérieur et une autre pour l'intérieur.. Logique non ? Ce qui est beaucoup moins logique, mais tout à fait normal par contre c'est que peu importe l'endroit ou vous trouverez à l'extérieur, le contenu de l'appartement sera constamment dessiné.

Si vous avez suivi un petit peu ce que je raconte depuis tout à l'heure, vous aurez compris pourquoi.. Pour VIS qui va réinterpréter tout ca par la suite, peu importe où vous vous trouvez dans la "pièce" rouge (la numéro 1), il considèrera qu'à tout moment vous pouvez très bien vous trouver en train de voler devant la fenêtre et donc avoir une pleine vue sur la pièce bleue ! Et c'est exactement pour ca que les hints vont nous servir..

IV. Les Hints

Venons-en au fait, car c'est bien beau d'avoir exposé des problèmes un peu plus haut, mais désormais il faut les résoudre !

IV.1. C'est quoi un hint ?

C'est une très bonne question, et c'est à ce moment là qu'il faut avoir un brin de bon sens et de logique.. Un hint sous Hammer ce n'est ni plus ni moins qu'un bloc normal paré des textures tools/toolshint et tools/toolsskip. Normal ? Non, en fait absolument pas :) A dire vrai, c'est plus complexe que cela.. et il ne faut pas voir les hints comme des blocs, surtout pas ! Si jusqu'à présent vous pensiez qu'un hint était un "volume" alors oubliez tout ca, la seule chose qui compte dans un hint sont les faces texturées avec la texture tools/toolshint.. Et uniquement les faces !

En fait, un hint n'est pas un bloc. Chaque face d'un bloc texturée avec la texture tools/toolshint est un hint. Si vous créez un bloc rectangulaire de 6 faces et que vous les texturez toutes avec cette texture, vous obtenez 6 hints.. tout simplement.

IV.2. Ca sert à quoi un hint ?

En étant très direct pour être bien clair, un hint va nous servir à découper en plusieurs morceaux les "pièces" que BSP découpe dans votre map. Oui je sais.. c'est pas spécialement clair dit comme ca, mais vous allez voir, ca va rentrer avec des schémas.

Cube 1 Voici un pavé.. bon, on va dire que c'est une "pièce" sous Half-Life.
C'est à dire que n'importe où que se trouve le joueur dans cette pièce, VIS considère qu'il peut se trouver à tous les endroits en même temps.

Cube 2 A l'intérieur de cette pièce, on créé un bloc..
Il faut créer ce bloc de façon à ce qu'il coupe hermétiquement la salle en deux.

Cube 3 Le but est maintenant de texturer la face qui "coupe la salle en deux" avec la texture tools/toolshint et toutes les autres avec la texture tools/toolsskip.
A ce stade, on peut dire que toutes les faces texturées en "skip" seront "oubliées" par le compilateur (d'où leur nom de "skip", "passer au suivant" en anglais)

Cube 4 Puisque les textures "skip" sont ignorées par le compilateur, on peut donc considérer qu'il ne reste plus que la face texturée en "hint".
C'est pour cela que je disais tout à l'heure que seules les faces texturées en hint seront transformées et qu'il ne faut pas voir les hints comme des volumes mais bien des faces.

Cube 5 Résultat, que reste-t-il après la compilation ?
Il reste notre pièce du début, mais découpée en deux parties par le compilateur en suivant la face "hint" utilisée comme une "frontière" entre les deux salles.

Finalement, ajouter un hint c'est comme ajouter un mur invisible pour le compilateur.. Ainsi, à cet endroit précis, il sait que le mappeur a voulu dire quelque chose, et ca permet de découper ces "pièces virtuelles" (appelées leafs) utilisées par VIS pour calculer la visibilité.
Alors certes, je vous déjà venir, "Mais à quoi ca sert finalement bon sang ?"... On y arrive..

IV.3. Comment s'en servir ?

IV.3.A. Exemple 1

Découpes horribles d'un étage Revenons à nos deux exemples du départ..
Revenons à ce découpage anarchique de BSP n'ayant pas compris l'esprit de la map..
Nous sommes bien d'accord que les hints sont fait pour ajouter des sortes de murs invisibles pour le compilateur.. Et nous sommes également d'accord qu'ici, ce qui a faché BSP c'est le fait que les trous des portes soient alignés et qu'il ne voit pas les portes !

Portes Qu'à cela ne tienne ! S'il ne voit pas les portes, et qu'il ne voit que des trous, alors nous allons l'aider à y voir plus clair en découpant à l'aide de hints ! Le but va être de boucher les trous des portes afin que BSP arrête de faire n'importe quoi et comprenne que cet étage est découpé en appartements et non en couloirs ! Sur le schéma ci-contre, les trous des portes sont repérés en vert clair.

Portes avec hints Portes avec hints Il suffit donc de créer quelques blocs de la taille des trous, les texturer avec la texture "hint" de chaque côté de la porte et en "skip" sur le reste des faces..
On obtient ainsi des "bouchons invisibles" pour BSP qui ne voit plus qu'une prolongation des murs..

Découpes magiques Et c'est ainsi que l'on se retrouve avec un découpage flambant neuf comme celui que nous désirions tant au début de ce tutorial !

IV.3.B. Exemple 2

Rez-de-chaussée Revenons maintenant à l'exemple numéro 2.. l'histoire du rez-de-chaussée surélevé.
On a compris que jamais on ne pourrait voir ce qui se trouve dans cet appartement.. tout du moins, tout ce qui ne se trouvera jamais dans le champ de vision du joueur

Rez-de-chaussée avec hint Il suffit alors de créer un autre mur invisible pour découper en plusieurs morceaux les "pièces" découpées par BSP.
Toutes les faces de ce bloc doivent être texturées en "skip" SAUF la face du dessous, qui est elle en "hint" bien sûr.

Rez-de-chaussée avec hint et découpes On obtient alors deux nouvelles "pièces" représentées ici en mauve et en vert.
Nous sommes alors d'accord que depuis la pièce mauve, il est totalement impossible de voir la pièce verte..
Le muret sous la fenêtre nous en empêche.
Ainsi, tout ce qui se trouve dans la partie verte ne sera PAS dessiné lorsque le joueur ne se trouve pas dans l'immeuble. (ce qui peut inclure les chaises, tables, tapis et autres..)

V. Conclusion

Comment trouver les endroits ou ca foire ? Rien de plus facile, deux commandes console sont vos meilleures amies pour optimiser votre map grace aux hints :

  • mat_leafvis 1 : Cette commande dessine à l'écran les contours de la "pièce" découpée par BSP dans laquelle vous vous trouvez actuellement.. C'est ainsi qu'il est possible de voir laquelle déconne et à quel endroit la découpe est anormale.
  • mat_wireframe 3 : Affiche la découpe des tous les brushes en polygones non-triangulaires. Mais cela affiche également, et surtout, par transparence les blocs cachés calculés tout de même, ce qui est très bien pour voir ce que le vis calcule et à quel endroit il calcule pour rien.

J'espère que ce tutorial vous aura un peu aidé à comprendre les hints.. Il reste certes de très nombreux cas de figure ou les hints peuvent s'avérer TRÈS utiles, mais il m'est bien sûr impossible de tous les détailler ! Néanmoins, si vous cherchez encore plus d'informations sur les hints :

En attendant, bon mapping et bonne optimisation !

Par NykO18
Le 12/08/2005

* Ouvrez la map sdk_hints.vmf fournie avec le SDK.
* Voyez cette page du VERC Collective.
* Voyez cet autre tutorial par moi-même.
* Voyez ce tutorial par Alucard_DH.
* Voyez ce tutorial par 00940.


Cette création est mise à disposition selon le Contrat Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ ou par courrier postal à Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.