4ème épisode

Assem Bhleur contre Docteur Fong

 

Les ambulanciers m'ont simplement introduit dans une jolie piècette avec un drôle de revêtement sur les murs et le sol. Et c'est dans la joie et dans le revêtement matellasé que je grave cette suite aux trépidantes aventures d'Assem Bhleur l'intrépide, qu'auront une fois de plus du mal à suivre ceux qui n'ont pas derrière eux l'expérience de dix années de lecture assidue d'Achille Talon.

 

Résumé des épisodes précédents

Tandis qu'elle se promenait toute seule tard le soir dans la galaxie, la fiancée du Redoutable Chevalier Assem Bhleur, celui devant lequel les bugs ne repoussent plus, se fit traitreusement enlever par l'infâme tyran Divaïd Hairor, on ne sait toujours pas trop au juste pourquoi.

Tandis qu'Assem se demandait bien dans quelle bar de l'espace il pourrait retrouver une aussi bonne cuisinière, le tyran lui apparu et le somma de s'approprier le terrible pouvoir du charme du Gouro, qui consiste, comme les plus endurants d'entre vous l'auront appris, à interpoler linéairement l'intensitée lumineuse sur toute la surface du polygone.

Ces formalités achevées, le Terrible Chevalier pu récupérer sa belle.

 

L'ATTAQUE INOPINEE DU VIL DOCTEUR FONG

Prévenu par le titre, Assem Bhleur, aux commandes de son vaisseau spatial intersidérant, était en train de se méfier lorsqu'un immense visage apparu soudain devant lui, flottant dans l'espace. Le sang d'Assem fit un tour en vitesse et se glaca :

- "Arg, je reconnais là l'oeuvre du Vil Docteur Fong"

lanca t-il entre ses dents (si vous arrivez à vous figurer ce que ca peut donner), en observant les reflets lumineux qui, sur le masque, se laissaient assez présompteusement admirer, et en vis à vis desquels le petit vaisseau en Gouraud du héros ressentait une furieuse envie de ne pas trop se montrer en public.

Assem ouvrit le feux de ses terribles faisceaux lasers mais le masque fit face.

- "Vade retro, c'est tenace"

gémit Assem.

- "Pour avoir une chance de triompher de ce masque originaire de la galaxie Toidé-Sudo, de la planette des exemples livrés avec, il te faudra trouver une telle matière pour ton vaisseau, tonna la voix du Docteur Fong".

Armé de son légendaire sens de la répartie, le vaillant Assem lui répondit du tac au tac :

- "beuuuh..."

Dès l'énoncé de cet afligeant prétexte, et se remémorant les remontrances qui lui fûrent amicalement adressées par un Cobalt Solaire après la publication du précédent récit de ses aventures (quelque chose à propos d'un soit disant appartement qui serait sous le vent des incinérateurs de la brigade des stups), Assem Bhleur se mit aussitôt à réflechir sans plus tarder au procédé qui lui permettrait d'atteindre cet objectif...

En somme, ce qu'il fallait, c'était calculer l'intensité de tous les points de la surface. Justement, c'est comme ça qu'il serait préférable de les calculer: en somme. Car pour calculer l'intensité il aurait fallu connaître le vecteur normal à la surface pour tous les points, ce qui était formelement impossible pour l'instant. Restait donc à interpoler toutes ces normales à partir des quelques normales qu'Assem connaissait aux sommets des faces polygonales. Et qui dit interpolation dit sommes.

Vous voyez, on s'y retrouve (enfin, vous je sais pas, mais moi oui).

Pour l'interpolation, Assem se rendit vite compte qu'une simple interplation linéaire des composantes cartésiennes des normales ne sufirait pas. En effet, avec ce type d'interpolation la norme du vecteur allait se perdre en route, ce qui serait coton à expliquer au vecteur lumineux lors du produit scalaire.

La première solution qui lui vint à l'esprit fut de renormer le vecteur normal à partir d'un vecteur interpolé linéairement. Mais pour ne pas crouler sous les calculs, il abandonna cette idée au profit d'une autre : pourquoi ne pas tout simplement interpoler linéairement les coordonnées angulaires du vecteur normal ? Argh, parceque, le vecteur lumineux ne pouvant pas encadrer les coordonnées sphériques (et ceci en dehors de considérations purement géométriques), il faudrait reconvertir les coordonnées du vecteur au cartésianisme avant de faire le produit scalaire.

C'est tandis que ce produit scalaire mesquin commencait à lui échauffer les oreilles qu'Assem Bhleur se souvint des écrits sacrés d'une peuplade primitive aujourd'hui disparue, les Hures.

 

Etude des Textes Hures

Plongons nous dans l'Encyclopaedia Rixedia pour en savoir plus au sujet de ces écrits sacrés...

Les textes Hures commencaient ainsi :

"Les textes Hures sont copyrightés par les Hures. La loi du 11 Mars 1957 n'autorise, aux termes des alinéas 2 et 3 de l'article 41, ' que les copies ou reproductions strictements réservées à l'usage privé du copiste et non destinée à l'utilisation collective '."

Heureusement pour le savoir universel, aventurier de l'espace traina les Hures devant les tribunaux galactiques pour non respect de la loi du 11 Mars 1957 qui ne leur permettait pas de recopier dans leur message de copyright l'extrait des alinéas 2 et 3 de l'article 41 de cette même loi, de sorte que les textes Hures sont aujourd'hui du domaine public. Nos hommages aux familles des nombreux législateurs qui continuent encore de nos jours à se suicider à l'évoquation de cette affaire.

A part ça, le principe des textes Hures est simple, et repose sur ce postulat:

"Est constant sur toute la surface d'un triangle le déplacement entre deux points consécutifs de l'image source mappée linéairement sur une scanline d'un triangle".

Ce postulat n'est pas marrant à montrer, mais il est facile à faire voir. Mettons nous d'accord sur les notations ; à gauche l'image source, à droite le triangle mappé :

      +----------------------------+ +-------------------------------+
      |         C                  | |                A           |  |
      |          X----             | |              X             |  |
      |(x2t,y2t)-     ----         | |           --- -            |  |
      |        -oo        ----     | |     x1 ooooooooo x2        V  |
      |       -   oooo    ------X  | |     B X--       -           Y |
      |      -      --ooo-       B | |          ---     -            |
      |     X ------    (x1t,y1t)  | |              ---  -           |
      |    A                       | |                 ----          |
      |                            | |                     X C       |
      +----------------------------+ +-------------------------------+

      ooooooooo = la scanline en court

Le vecteur pour interpoler dans la texture est, à chaque scanline, égual à :

       | x = (x2t-x1t)/(x2-x1)
     V |
       | y = (y2t-y1t)/(x2-x1)

Or, on voit que, en fonction de Y, on a :


        ^            |          | / X2-X1
        |            |         /|   .... Y2t-Y1t
        |            |      /   |...            X2t-X1t
        |            |   /  ....|        ------
        |            |/ ....    |  ------
        |          /.|..     ---+--
        |       /... | ------   |
        |   ./.. ----+-         |
        | /------    |          |
        +------------+----------+-------------------------->
       YA            Y1         Y2                          Y
Il est clair qu'au point Y1 les rapports (x2t-x1t)/(x2-x1) et (y2t-y1t)/(x2-x1) sont les mêmes qu'au point Y2 (Thalès, niveau 4ème). Il faut donc calculer ces coordonnées une fois pour toute (une fois par triangle), en divisant les quotients consernés (comme pour le Gouraud, mais en X et Y).

Voilà bien une bonne chose. Les textes Hures fournissaient alors des exemples de code généré, à base de :

        mov al,[bx+1234]
        mov ah,[bx+1234]
        mov es:[di+1234],ax

Où les "1234" sont à considérer, comme de coutume, comme des valeurs variants au long du code gen.

Assem Bhleur conçut aussitôt sa routine de mapping, avec une petite idée en tête : il allait utiliser du mapping avec comme image source un halo géant (des cercles concentriques d'intensitée décroissante en partant du centre). En faisant de l'environment mapping avec cette texture, il parvint à un effet assez proche de celui de Fong, et triompha du masque.

Ais-je ommis, dans ma précipitation d'en finir avec ce bête canard (non, c'était un masque), de préciser ce qu'est l'environment mapping ? Il semblerait bien, mais ne nous alarmons pas. L'enviro consiste en fait à déterminer en temps réel qu'elle est la texture à mapper sur chaque face en considérant la position de la face ainsi que l'orientation du vecteur normal à la surface aux sommets de la face.

L'effet recherché étant de refléchir la texture sur l'objet, il suffit donc, pour chaque point de l'objet, de calculer l'intersection entre la droite qui part du point et de vecteur directeur le vecteur normal à la surface en ce point, et avec le plan (ou, si vous ne craignez pas le déformations, avec la sphère) qui contient la texture à refléter.

Les calculs sont bidons (dans le cas du plan), c'est comme pour une projection 3d-2d sauf que c'est presque quasiment le contraire (mais pas tout à fait cependant).

Allez, au risque de fournir une pièce supplémentaire au dossier que tentent de constituer les partisants du mode graphique, je vous fait un petit schéma pour expliquer ca, dans un des deux plans à considerer :

        X ^ 
          |
          |-------
          |^      -------       M (un point relatif au repère O)
          ||Xt           --<---X
          ||             Vecteur normal en M
          ||
          ||                           O (le centre du repère)
         -+---------------------------X------------>Y
          | -------------------------> Yo
          |
          |    On voit que :  Xt = Xv*(Yo+Ym) + Xm
          |      Avec Xt = coordonnée X dans la texture
          |           Xv = coordonnée X du vecteur normal en M
          |           Yo = coordonnée Y de O par rapport à la texture
          |           Ym = coordonnée Y de M
          |           Xm = coordonnée X de M
          |
          |<- Plan contenant la texture à refleter

 

La Contre attaque de Jim Agic

Alors que le preux Chevalier de l'espace s'en allait déjà vers de prochaines aventures, une énorme astéroide fit volontairement preuve d'un manque de zèle évident pour éviter de justesse le vaisseau du preux Chevalier. On est même en droit d'affirmer qu'il lui fonca carrément dessus.

L'astéroide parraissait menacant, du haut de ces 7800 faces texturées et lightées par deux sources de lumière distinctes.

- "Heureusement, j'aime les problèmes complexes, cela me dope, pensa Assem à voix basse".

Comment superposer une texture avec un éclairement "à la Fong" ?

Facile, pensa Assem : il n'y a qu'à superposer le mapping classique de la texture dont on prend garde de séparer les teintes dans la palette et a ordonner les couleurs par ordre d'intensité croissante (ou décroissante), avec un environnement mapping de halo classique et d'ajouter (ou de soustraire) les deux, points par points !

Ce qui donne un code du genre :

        mov al,[bx+1234]     ; le 1er point de texture
        mov ah,[bx+1234]     ; le 2ème point de texture
        add al,[si+1234]     ; le 1er point d'enviro
        add ah,[si+1234]     ; le 2ème point d'enviro
        mov es:[di+1234],ax

Et pour obtenir deux sources lumineuses distinctes, il n'y a qu'à tracer deux halos dans la texture d'environnement. (y'a ka, y'a ka... Facile tout ça)

De dépit, l'astéroïde du dominator alla se cacher derrière un nuage de Larusse.

 

EPILOGUE

Et ainsi se termine la fin du récit des aventures d'Assem Bhleur le hardi, qui put sauver la galaxie, délivrer la princesse, retrouver le trésor, terminer la course avant le lièvre, et tout ca.