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 ]