Mandragor


Les portals

Avec tout ce qu’on a vu jusqu’à présent, on est en théorie capable d’afficher à peu près n’importe quoi. Le problème c’est qu’en général, le moteur ne « comprend » pas l’objet. Pour lui, il n’est qu’une suite de triangles. C’est normal me direz-vous, que voulez-vous qu’il sache d’autre ?

Ce genre de moteur « qui affiche les objets sans les comprendre », c’est ce qu’en général j’appelle des moteurs « externes », par opposition aux moteurs « internes », qui affichent en général les objets dans lesquels on se déplace. Dans des couloirs etc, donc tout ce qui est moteur à la doom-like.

Parce que c’est vrai, pour afficher un niveau de doom (ou de quake), que feriez-vous ? Vous allez passer en revue toutes les faces du niveau et les afficher ? Bonne chance, il y en a un certain nombre, et même un nombre certain. D’autant plus qu’il s’agit d’un gaspillage énorme. En général, on ne voit pas sur un écran le centième du niveau dans lequel on évolue.

L’idée de base, pour afficher ce genre de niveaux, c’est de le décomposer en pièces, que l’on appellera « secteurs ». Ces secteurs sont fermés, dans le sens où il n’y a pas de « trous » dedans. Quelle que soit la direction dans laquelle on regarde, on va forcément tomber sur un mur du secteur. Ca peut sembler idiot, et bien pas tant que ça

Bon, vous allez me faire remarquer que si le secteur est à ce point fermé, cela veut dire qu’il n’y a tout simplement jamais la moindre porte à mes pièces, ça va être dur de se balader là dedans. Effectivement... Mais après tout, une porte, même ouverte (disons le « trou » de la porte), ne peut-on pas considérer ça comme étant une face ? Bon, une face un peu spéciale, mais une face quand même... En fait, une face qui dit : « moi, il faut pas chercher ma texture ou des conneries du genre, il faut juste afficher le secteur machin à la place ». Lequel secteur machin est également un secteur fermé, mais qui possède également des faces spéciales, lesquelles vont demander l’afficher d’autres secteurs, et ainsi de suite. Ces faces spéciales sont appelées de « portals ».

On se rend bien compte que, de proche en proche, avec une logique pareille, on va dessiner tout le niveau. Pire que ça, on risque même de boucler, donc de revenir au point de départ, de ne pas s’en rendre compte et de tout réafficher une fois de plus, et ainsi à l’infini. Plantage assuré.

C’est là qu’est la nouvelle idée : supposons que la pièce que nous regardons au travers d’un portal possède elle-même des portals. Est-il utile d’aller afficher le secteur qui se trouve derrière ce nouveau portal si le portal lui-même n’est pas visible car caché par un des murs du secteur dans lequel on se trouve ? Explication en image vu du haut :

Si nous nous trouvons au point blanc, nous pouvons voir une partie du secteur rouge, mais bien que ce secteur rouge possède un portal vers le secteur jaune, il est totalement inutile de le prendre en compte car il n’est pas du tout visible. Comment savoir les portals qui sont visibles et ceux qui ne le sont pas ? Et ceux qui sont « un peu » visibles ?

Mais c’est là qu’on réfléchit et qu’on se dit : si, au moment de tracer le secteur rouge, je resteignais mon champ visuel à l’ouverture de la porte (je sais le faire très facilement grâce à tout mon système du clipping 3D), ce qui serait effectivement dessiné du secteur rouge serait... uniquement ce qu’on est sencé voir du secteur rouge, et rien de plus ! Et donc, si avant de tracer le secteur jaune, on fait passer le portal rougeà jaune dans le « clippeur », comme toutes les autres faces, on se rendra compte ici que ce portal est invisible et doit donc être ignoré.

Si vous réfléchissez un instant, vous vous rendrez compte que ce système est totalement général et fonctionne très bien : quand on dessine un secteur et que l’on tombe sur un portal, on « clippe » ce portal de manière à n’en garder que sa partie effectivement visible, on restraint le champ de vision (on reconfigure le clippeur) à cette partie visible du portal, et on dessine le secteur qui se trouve « derrière » ce portal. Lequel secteur va peut-être lui-même restreinte son champ de vision etc, ça fonctionne d’une manière récursive. Ce mouvement s’arrêtera de lui-même quand on arrivera dans des secteurs n’ayant aucun portals de visible, ce qui arrivera rapidement.

Si vous continuez à réfléchir, vous comprendrez que si vous partez du secteur dans lequel se trouve l’observateur avec comme clipping initial le clipping « écran » normal, vous afficherez EXACTEMENT ce qu’il faut afficher. Pas un pixel de plus, et pas un pixel de moins. Si votre écran fait 640x480 pixels, vous allez dessiner 640x480 pixels. Plus besoin de trier quoi que ce soit, plus besoin de faire de Z-Buffer, plus besoin de rien du tout, et vous ne prenez en compte que les secteurs visibles, c’est à dire une toute petite partie du niveau. Génial, non ?

La seule difficulté, c’est d’être capable de correctement placer les plans de clipping 3D pour correspondre à « l’ouverture de la porte », ce qui est un petit travail de géométrique analytique pas trop compliqué. Il faut également se souvenir que modifier la visibilité pour afficher un portal, c’est bien, mais restaurer le clippeur comme il était avant, c’est encore mieux. Il faut donc penser à sauvegarder l’état du clippeur avant de passer aux autres portals.

Comme les niveaux de Doom et de Duke3D étaient en fait des niveaux « plats », le calcul du clipping était beaucoup plus simple, mais ça n’est jamais qu’un niveau de généralisation en plus. Si, à l’époque, ils n’ont pas fait des niveaux un peu plus génériques, je pense que c’est plus un problème d’affichage de faces sans trop de correction de perspective qu’autre chose. Car dans Doom, les murs sont toujours verticaux et le sol est toujours horizontal, ça permet de simplifier de beaucoup le traçage des faces avec une bonne perspective.