Aardschock, dessine-moi un blob




                       Kookoo glop glop !!



    Vous vous demandez, peut-être, ki peut bien  être ce crétin ki
écrit aussi mal ? Bon hé bien voilà... J'ai honte je l'avoue, mais
je tente d'écrire un article pour le ToXic MaG 9 : ils ne me l'ont
même pas demandé, non non ! Mais bon, comme ils avaient l'air d'en
manquer dans le N° 7, voilà je me dévoue koi, y'en faut bien... Je
sais même pas si ils vont l'accepter mais y'a intérêt hein passkeu
bon, 'tention !! Non mais, m'enfin koi...

    Sans blague !


    Voilà, je  m'appelle Patapom/Aardschock et  je suis un geôntil
coder de  chez HEMOROIDS, vous savez, le célèbre groupe connu dans
le monde entier et plus loin encore... Bon, 'fin, restons modestes
koi, un peu d'humilité !

    Je  sais pas  si certains "petits malins" sont  intéressés par
l'infographie (disons infographie du point de  vue "mathématique")
tout  du moins aux  démos, mais c'est  d'un effet nouveau  et d'un
objet volumique assez intéressant (dans POV ou autre "ray-tracer")
dont je vais vous narrer l'histoire, en effet, il s'agit :


    Des BLOBs !! (Roulement de tambour)


    Peut-être vous êtes  vous demandés, en voyant  la nouvelle pub
pour ADIDAS(TM) (celle où y'a pas mal de synthèse et ki concrétise ma
vision  du monde  futur, mais ki, malgré  tout, fait  triompher le
sport... (Zut ! Pas cool ça !)

    ...peut-être vous êtes vous demandés, disais-je donc qu'est-ce
ke l'anneau bizarroïde vert ki tourne au dessus de la tête du gars
kan  il est assis  dans la "machine infernale" ??  Oui, évidement,
pourkoi vous seriez vous posé cette  kestion ?? Hein, pourkoi ? Il
y'en a tellement d'autres à se poser komme :

- Pourkoi les réceptions de l'ambassadeur sont-elles réputées pour
  leur bon goût ?

- Peut-on réaliser 3 désirs à la fois ?

- 100 Grammes de Kinder(TM) chocolat sont-ils vraiment équivalents à
  un grand verre de lait ?

- Les moules ont-elles des dents ?

- Peut-on considérer les filles comme des êtres humains ?
  (Désolé...)

- La Terre est ronde au fait ?


    Néanmoins, ces autres  kestions feront  l'objet d'un  prochain
article, celle  ki nous  intéresse  est donc : "K'est-ce ki flotte
autour de la tête du môssieur ?".

    Oui, k'est-ce ki flotte donc hin ?? Evidement, bande de petits
perspicaces, vu le titre de l'article, les BLOBS, vous vous doutez
certainement ke c'est un BLOB, hé bien voui ! C'en est !! Si si !!
J'vous jure ! Regardez encore cette pub, vous  verrez ke c'est une
sorte de  chenille  avec des anneaux  un tipeu trisomikes  sur les
bords, je crois  même k'elle se  transforme, 'fin là  n'est pas la
question...

    Un BLOB, Définition :
    --------------------
    Voyons, cherchons dans le 'tiLarousse, non...
    Le 'ti Robert, non... Zut, mais alors ??
    Robert & Collins ?? Ah ! Ca veut dire goutte ou tache, voui...

    En fait ce mot a  été utilisé par Mr X. (Vous  savez, celui de
Cluedo) mais bon, il faudra bien attendre une 10aine d'années pour
k'il apparaisse dans  un dico français et soit  considéré comme un
mot sérieux ! Evidemment, tout  le monde ne l'emploiera pas à tout
bout de champ...

    Je vais donc tacher de donner ma propre définition (lavée avec
Gamma Ultra) d'un blob :

    Je vais dire ke c'est en fait le résultat d'une mise en commun
de champs  de densité émis par des  éléments ponctuels, ces champs
se traduisent par un flux densitique radial ki est  représenté par
un disque si on est en 2D ou une sphère si l'on est en 3D...

    Pour ceux ki n'auraient pas la télé (?) et ki, par conséquent,
n'auraient  pas eu  l'occasion de  voir la pub d'ADIDAS(TM), je  vais
donner une représentation plus imagée d'un blob :

    Imaginez un point  ki possède, comme  tout corps, un  champ de
gravité plus ou moins accentué (selon Newton, il est proportionnel
à la masse du corps en kestion) ki peut-être modifié à volonté (et
même devenir négatif ! Sisi !).

    Voilà, maintenant imaginez de l'eau ou du whisky (plus cool !)
ki forme une  couche autour de ce point, cela donne  une sphère de
whisky, un océan de whisky en fait, whoua le pied !

    Prenons deux points ki  correspondent à ça, 2 océans de whisky
koi... L'un noté 0 et l'autre 1. Si on les rapproche, l'océan 1 va
être  sujet à la force de  gravité  ki s'exerce  sur l'océan  0 et
inversement, on peut aisément imaginer les océans ki passent d'une
planète à l'autre tout en formant une couche homogène...

  Dessin :
  ------
                        _____       _____
      Centre0          /     \     /     \          Centre1
      ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨/¨\     ¨---¨     /¨\¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
                     ¦   \             /  ¦
                     ¦    o           o   ¦
                     !                    !
                      \       =¨¨¨=       /
                       \     /     \     /
                        ¨¨¨¨¨       ¨¨¨¨¨

    Hé ben voilà, un blob est en fait une suite de sphères dont la
densité  propre et le  diamètre sont  variables... (Ce sont  les 2
paramètres de chaque sphère).

    Je vous  avouerai ke j'ai, honteusement, regardé  la source de
POV V2.2 pour m'en approprier le contenu, mais komme je ne connais
pas le C, ça a été dur et  puis même après  avoir passé une après-
midi à observer minutieusement ce soft ki se place plutôt du point
de vue du rayon lumineux (normal pour un "Ray-Tracer" je trouve !)
avec des jolies résolutions  de quartiques (fonctions polynômiales
de degré 4 ! Aaargh !) je n'ai pas réussi à comprendre vraiment la
formule utilisée :

            Densité = Force * (1-(Distance/Rayon)^2)^2

          (J'explikerai la formule plus tard, DON'T WORRY !)

    ki me semble étrange et à priori fausse (Oui oui, je comprends
votre  étonnement !) puiske en  effet, la  limite  de la  fonction
densité en  ± tend  vers  +, alors ke la  densité aurait  plutôt
tendance à  s'atténuer au  fur et à  mesure ke  l'on s'éloigne  du
centre de la  sphère, néanmoins j'ai refait moi-même la formule ki
s'écrit désormais sous la forme :

            Densité=Densité_Propre * EXP(-(Distance/Rayon)^2)^2

    (ki semble un tipeu plus complikée mais bon, elle marche bien)


Formule de POV  \/            Ma p'tite formule à moi   \/

                 ^ Densité                               ^ Densité

                 ¦               Vers l'infini           ¦

  \              ÷              /                        ÷

   \            /¦\            /                        /¦\

    \          ¦ ¦ ¦          /                        ¦ ¦ ¦

     \         / ¦ \         /                         / ¦ \

      \       ¦  ¦  ¦       /                         ¦  ¦  ¦

       \     /   ¦   \     /                          /  ¦  \

        \    ¦   ¦   ¦    /                          /   ¦   \

         \  /    ¦    \  /             Vers 0      ~~    ¦    ~~


----------¨¨-----------¨¨----------->  --------¨¨¨¨-------------
                                                       ¨¨¨¨------>
                            Distance                     Distance


    Peut-être ne vous ai-je pas convaincu et là, je vous comprends
passkeu  bon, croire un  pauvre débile de HMD comparé à d'éminents
mathématiciens... Normal...

    En plus, la formule de POV est plus classe, passkeu kan on est
à une distance ki est égale au rayon de  la sphère, la densité est
nulle alors ke pour avoir une densité nulle avec ma formule, vu ke
c'est une  exponentielle, DUR DUR ! (DUR DUR n'est  ABSOLUMENT pas
une citation de Jordi !! Je le hais !).


    Dans ma formule :
    ---------------

    Pour obtenir le rayon effectivement entré en paramètre il faut
recalculer  le rayon  ke l'on  va utiliser dans la formule grâce à
ceci :

                           Rayon_Entré_En_Paramètre
Rayon_Pour_Le_Calcul =  -------------------------------    [*]
                        SQR( LN( ABS( Densité_Propre)))

    Mais ce calcul n'est à faire k'une seule fois encore heureux !

   Cependant, on va continuer  avec MA formule et si vous êtes pas
contents, bin c'est pareil, et TOC ! (Un cheesburger !) Voilà donc
j'essplik  l'algorithme en 2D, pour  la 3D c'est  pareil hein ! Il
suffit d'étendre à la 3ème dimension ...

    On prend donc N sphères définies avec les deux paramètres bien
connus maintenant, c'est à dire : Densité_Propre et Rayon

    1) Il va falloir délimiter une zone  à parcourir, un rectangle
       ki va englober toutes les sphères définies tantôt.

    2) Recalculer les  rayons de  chaque sphère, ceux  ke l'on  va
       utiliser dans la formule ki donne la densité.
       -> voir formule [*]

    3) Pour chaque point du  rectangle englobant, il faut calculer
       la densité totale en ce  point ki est en  fait la somme des
       densités de  chaque sphère... (avec la formule  donnée plus
       haut).

    4) Si cette  densité est supérieure  au seuil fixé 1, alors on
       affiche 1 point ! (Pour POV la densité doit être inférieure
       à un seuil limite ce ki fonctionne aussi, mais je trouve ke
       c'est beaucoup plus chiant pour trouver les bons paramètres
       alors...).


    La formule  de POV est  plus simple, mais il  existe  aussi un
seuil et la densité  change de façon  assez significative selon le
nombre de  sphères utilisées, ce ki  oblige à recadrer  le seuil à
chaque fois, mais si vous voulez essayer, je vous souhaite bien du
courage  pour  trouver  des  paramètres  corrects,  passkeu  c'est
vraiment balaise hein ! Ouille Ouille Ouille !!

    Avec ma méthode, le seuil est fixé à 1 ! Evidemment on peut le
changer...

    Voici le programme  en GFA-Basic... Je  n'ai pas mis la source
assembleur  passkeu c'est pas  vraiment intéressant  vu ke ça rame
comme pas deux sur un ST ! (Le vrai programme GFA doit être sur la
diskette je pense)

'
' Run the program in low resolution
'
ON BREAK GOSUB break
SETCOLOR 15,0
'
' Npoints defines the # of spheres
'
npoints=3
'
' Draw_Step is the quality of drawing (1 is Max)
'
draw_step=3
'
' Declaration of arrays
'
DIM sphere_posx(npoints-1),sphere_posy(npoints-1)
DIM sphere_density(npoints-1),sphere_radius(npoints-1)
DIM real_sphere_radius(npoints-1)
'
' Declaration of elements (spheres)
'
sphere_posx(0)=160-60
sphere_posy(0)=110
sphere_radius(0)=50
sphere_density(0)=3
'
sphere_posx(1)=160+50
sphere_posy(1)=140
sphere_radius(1)=40
sphere_density(1)=3
'
sphere_posx(2)=160+25
sphere_posy(2)=50
sphere_radius(2)=30
sphere_density(2)=2
'
' Find real sphere radiuses for calculs
'
FOR n=0 TO npoints-1

real_sphere_radius(n)=sphere_radius(n)/SQR(LOG(ABS(sphere_density(
n))))
NEXT n
'
' Set the bounds for the first element
'
bound_minsx=sphere_posx(0)-sphere_radius(0)
bound_minsy=sphere_posy(0)-sphere_radius(0)
bound_maxsx=sphere_posx(0)+sphere_radius(0)
bound_maxsy=sphere_posy(0)+sphere_radius(0)
'
' Detect bounds for other elements
'
FOR n=1 TO npoints-1
  bound_minsx=MIN(sphere_posx(n)-sphere_radius(n),bound_minsx)
  bound_minsy=MIN(sphere_posy(n)-sphere_radius(n),bound_minsy)
  bound_maxsx=MAX(sphere_posx(n)+sphere_radius(n),bound_maxsx)
  bound_maxsy=MAX(sphere_posy(n)+sphere_radius(n),bound_maxsy)
NEXT n
'
' Displaying fast informations
'
COLOR 2
FOR n=0 TO npoints-1
  ELLIPSE
sphere_posx(n),sphere_posy(n),sphere_radius(n),sphere_radius(n)
NEXT n
'
' Scanning bounded zone...
'
DEFFILL 4
FOR y=bound_minsy TO bound_maxsy STEP draw_step
  FOR x=bound_minsx TO bound_maxsx STEP draw_step
    '
    CLR density
    FOR n=0 TO npoints-1
      length=(x-sphere_posx(n))^2+(y-sphere_posy(n))^2

' Là on ajoute la densité pour chaque sphère \/

      ADD
density,sphere_density(n)*EXP(-length/(real_sphere_radius(n))^2)

    NEXT n
    '
    IF density>1
      PBOX x,y,x+draw_step-1,y+draw_step-1
    ENDIF
    '
  NEXT x
NEXT y
'
~INP(2)
EDIT
'
PROCEDURE break
  EDIT
RETURN


    Voilà... Vous remarquerez ke les densités propres déclarées au
départ dans "Sphere_Density (n)" sont assez proches de 1 (elles ne
doivent pas être égales à 1, attention, sinon  ça va provoquer une
erreur au  moment  où le  Basic va  essayer de calculer  le  rayon
effectif de la sphère (Real_Sphere_Radius) puiske le  log népérien
de 1 est 0, cela va provoquer une division par zéro, hé voui !)

    Le fait k'elles soient proches de 1  implique ke le logarithme
va tendre vers 0 et le rayon effectif va donc tendre vers + ce ki
va se  répercuter dans  la formule du  calcul de la densité par un
terme dans l'Exponentielle ki  tend vers 1 donc, à  supposer ke la
densité propre de la sphère soit  supérieure à 1, la zone  entière
ke l'on  va  balayer  va posséder une  densité  supérieure à  1 et
ainsi, tout sera rempli, le rectangle englobant sera (largement !)
dépassé, faites  donc attention à  ne pas descendre en  dessous de
1.2 environ, je ne sais plus trop... Avec l'exemple  ke je vous ai
fourni, cela montre bien l'usage des blobs, on peut faire plein de
trucs rigolos avec...

    Par  exemple, certains  modeleurs  sur stations graphiques les
utilisent pour  modéliser des  surfaces intéressantes, ils ne sont
plus appelés blobs  mais méta-balls, des anims  de dinosaures avec
des textures  hyper-réalistes  ont  été réalisées grâce  à cela...
Vous pouvez aussi faire des anneaux bizarroides  verts ki tournent
au-dessus de la tête des gens, comme  dans  certaines pubs... (Pas
les pubs Kinder, Non !!)

    Evidemment les blobs sont des éléments volumiques (définis par
leur volume) et je n'ai absolument aucune idée de la façon dont on
peut  calculer la  normale  en  tout  point de  leur surface (pour
obtenir  les rayons  spéculaires et transmis  nécessaires  au  bon
fonctionnement d'un lancé de rayon).

    Néanmoins, il est assez évident de transformer un "blob" en un
objet "surfacique" (défini par sa surface !!), c'est à  dire en un
ensemble de  facettes  animables à  partir d'un  simple  moteur 3D
habituel  ce ki est intéressant, puisske  la "mode" dans les démos
semble pousser les  gens à  utiliser des objets  débiles ki  n'ont
plus trop de rapport avec nos bons vieux cubes d'autrefois. Héhé !
(Rèf: DOPE, NO !)

    C'est  pour  ça  ke  je  verrais  bien  un 'tit  blob  rotater
tranquillement hop hop !

    Je vous explike la façon de  procéder pour reconvertir un blob
en facettes mais je file pas le source ASM passkeu j'ai pas encore
fini, bin vi...

    En fait  c'est simple, il suffit  de calculer bêtement le blob
comme montré dans le programme d'exemple en  GFA sauf ke là, c'est
plus un rectangle englobant  ke l'on parcourt, ben naaaan, mais un
parallélépipède, ça bouffe plus de temps, forcément !

    Puis on  s'amuse  à découper  le parallélépipède en  tranches,
selon un des 3 axes mis à notre disposition. Généralement, il vaut
mieux prendre celui sur lequel le blob semble le plus allongé...



            *--------------*
           /  /  /  /  /  /¦
          /  /  /  /  /  / ¦
         *--------------* <+---------« Le blob est à l'intérieur !
         ¦  ¦  ¦  ¦  ¦  ¦  *      (Il est fait comme un rat, il ne
         ¦  ¦  ¦  ¦  ¦  ¦ /        peut plus s'échapper Haha !)
         ¦  ¦  ¦  ¦  ¦  ¦/
         *--------------*
            ^
            ¦
            ¦____ Tranche (comme un Savane de Brossard, HMMMmm !)



    On coupe autant de  tranches ke la précision  demandée sur les
facettes... Pour chaque tranche on va obtenir un bout de blob tout
plat ki aura une  forme bizarre, mais  le problème c'est  ke cette
forme est souvent concave  donc problème pour  modéliser un simple
polygone ! Argh !

    La solution réside en un suivi de contour, il faut :

    1) Balayer la tranche de ("cake") blob de haut  en bas et pour
       chaque ligne, balayer de gauche  à droite (c'est arbitraire
       hein ! On peut changer !!) jusqu'à ce ke l'on  rencontre un
       point de densité non nulle... en X0,Y0 et là on s'arrête !!

    *-------->
    ¦
    ¦Sens du balayage
    ¦                 _____       _____
    v                /     \     /     \
                    /       ¨---¨       \
                   ¦                    ¦
    Une tranche :  ¦                    ¦
                   !                    !
                    \       =¨¨¨=       /
                     \     /     \     /
                      ¨¨¨¨¨       ¨¨¨¨¨

    2) On se place en X0-1,Y0 puis on commence le suivi de contour
       ki konsiste à  détecter  les points  qui sont  adjacents au
       point courant et à agir en conséquence :

       * il nous faut une matrice de 3*3 dont le point central est
         le point  courant... Les autres  points sont  en  fait la
         densité des points adjacents  (0 ou 1)

           *---*---*---*
           ¦ 8 ¦ 7 ¦ 6 ¦
           *---*---*---*
           ¦ 5 ¦ X ¦ 3 ¦     Matrice de densité
           *---*---*---*
           ¦ 2 ¦ 1 ¦ 0 ¦
           *---*---*---*

    On code la matrice comme suit :

    MAT = 256*D(8) + 128*D(7) + 64*D(6) + 32*D(5) + 16*D(4) +
          8*D(3) + 4*D(2) + 2*D(1)+ 1*D(0)

    -> avec D(x) correspondant à l'absence ou la présence de point
cela  donne des valeurs  définies pour  chaque cas  rencontré, par
exemple :


    MAT = 1+2+4+8 -> Signifie ke, si on va  vers la droite, il y'a
                     des points en dessous de la position courante
                     et k'il  y'a  aussi  un  point  devant  nous,
                     k'allons nous faire ?

    Hé bien simplement sauter ce point :

         /--> Hop !
         ¦
         ¦
         *



    Il  suffit de  répertorier  ces cas et hop !, on a un suivi de
contour parfait ! Ce ki nous donne pour  chaque tranche sur Z (par
exemple) un amas de  points sur X,Y ki forment  en fait la tranche
de  blob, il n'y  a plus k'à  agencer ces  points  pour donner  un
contour fermé ki respecte bien celui du blob...

    Il faut bien  évidemment continuer de scanner toute la tranche
puisske en effet il peut y avoir des cas particuliers, comme celui
ci :

                _____            _____
               /     \          /     \
              /       \        /       \
             ¦         ¦      ¦         ¦
             ¦         ¦      ¦         ¦   Baisé ! Haha !
             !         !      !         !
              \       /        \       /
               \     /          \     /
                ¨¨¨¨¨            ¨¨¨¨¨

    Alors faisez gaffe les copains koi...


    Valà valà, je crois ke ça suffit pour aujourd'hui !!!! C'était
Schock-Schock en direct de Blob-Land, à vous Cognac-Jay...


    Mon adresse jolie :
    -----------------        Aardschock / Hemoroids
                             Patapom    / Hemoroids  ( 3614 RTEL)

                         ou       MAYAUX Benoît
                                  3 Rue Jean LEBAS
                                  54510 TOMBLAINE

                         83-20-79-75 (aux heures pas trop tard)


    Je suis là pour tout renseignement, ouverture  de CCP, voyance
en direct (PATAPOM is Mme SOLEIL too !), ou même réseau clandestin
de distribution de CARANOUGATS amateur de schamallows (les Haribos
je préfère).

    Je me referais  bien l'article  en anglais  pour nos amis "les
autres", mais bon, ca fait déjà suffisamment de pages  je pense...
épi j'ai pô envie, Na !


                                               Zi ENd



[ Retour au sommaire ]