Le mauvais GOO ( kaï kaï kaï's POWER ! )
Le dimanche 8 juillet 2007 à 19:59 :: Flash-AS3 :: #16 :: rss :: 2173 lectures
classe AS3 de déformation d'image basée sur le displacementMapFilter.
je l'ai eu ! je l'ai eu !
suite au billet précédent je m'étais mis en tête de faire un GOO.
kaï's power GOO était un logiciel particulièrement inutile qui permettait d'opérer su rla photo de mamie des déformations prodigieuses telles le swirl (tourbillon), bulge ( sphérisation), pinch (pincement), smudge (doigt sale) et smear(floboloboblob!). Et le tout en temps réel. C'était tellement un culte que certaines personnes au goût douteux continuent de se croire malin en faisant un GOO, alors que c'est nul.
Pour les malheureux qui n'auraient jamais essayé ce logiciel exceptionnel, il existe des alternatives freeware dont Anmanie SMP est la première que j'ai trouvé sur googoole.
Voila pour le décor
Après, je disais " jel'ai eu !" car rarement un script tout seul m'aura pris autant de temps et d'énergie et d'errances et de ratés et de 'putain mais où est ce que ça merde ?!' et de 'rhhhaaaaaaa ! chié ! merde et merde !'
pourtant c'est tout con, vous avez peut être entendu parler d'un petit gars qui s'appelle Andre, oui oui un petit jeune qui débute ...
ce gars a la faculté agaçante de ruiner tous les efforts qu'on (je ne pense pas être seul) peut faire pour coder des trucs beaux et mystérieux ; à chaque fois je vais sur son site, je me prends une grosse claque dans la tronche et je retourne, contrit, à ma scriptouille.
Comme dit guepard : "je sais pas ce qu'il prend mais j'en veux !" 
hors il a commis ça : gooify qui se pose là dans le style 'parfaitement agaçant' mais qui m'a quand même mis sur la piste (j'y reviens après).
zou ! démo ! essaie de redonner une tête normale à ce pauvre Christopher Lee :
pas facile hein...?!
La source (arrachée de haute lutte! )
dans le code source il est possible de jouer sur la vitesse de déformation (là il est un peu rapide) avec l'alpha de la classe Pinceau et sur l'intensité du décalage en paramétrant le filtre (l.89-90 dans goo.as)
Par ailleurs je trouve presque plus joli le motif dessiné en couleur que le goo lui même^^
Bon je dis j'ai réussi mais je ne comprend toujours pas comment il fait pour ne pas avoir de décalage au départ...sacré Andre va!
en fait c'est super simple et dans l'exemple qu'il donne c'est relativement évident mais j'ai compris ça seulment à la fin, ce qui tombait bien puisque j'avais déja compris tout le reste 
L'idée générale du displacementMapFilter, c'est d'utiliser une image en niveaux de gris pour décaler des pixels. cas d'école les générateurs de terrains (lien trouvé sur le blog de monsieur shoebox ).
Au départ je me suis dit, ok, au click on va récupérer :
- le décalage en X Y depuis la dernière pression
- la distance
- l'angle depuis la dernière pression
le décalage nous servirait d'épaisseur pour le trait, l'angle nous indique la direction des scalex / scaley du filtre et la distance nous permet d'établir un seuil au dessous duquel on ne trace pas (pour pas gâcher des ressources).
ça ne marche pas. enfin si ça marche mais comme l'anlge est recalculé tous les 10èmes de seconde et que les scalex X et Y sont indexés dessus ça fait très mal à la tête ( si tu ne me crois pas regardes ça ).
Alors après je me suis dit tiens puisque le displacementMapFilter peut traiter 2 CANAUX pourquoi ne serais tu pas très malin et tu dessinerais sur les 4 couches (alpha inclus), comme ça ça te donnerait les 4 directions et en combinant l'opacité tu obtiendrais la valeur de déplacement pour chaque pixel.
riche idée, donc j'ai fais des switchs dans tous les sens pour les angles, les couleurs, le blendMode du pinceau et au final le DisplacementMap qui est un gros gourmand pouvait être traité jusqu'à 8 fois ce qui est complètement débile, en plus je m'étais embarqué dans une classe pinceau hyper sophistiquée avec des accesseurs de partout qui entraient en conflit avec les variables de SPrite etc. etc.
et le plus rigolo c'est que ça marchait pas ! ... haha!
j'ai dormi, j'en ai révé évdiemment, et ce matin je suis retourné voir le gooify d'Andre et là je lis les commentaires et là trop bien :
un mec (cathelper) dit :
Thanks for everything. Your work has been a great inspiration and a problem solver for us.
One question about the Gooify:
I’m trying to make somethign like this. Am i on the right path given this:
dark blue - right
light green - left
dark green - down
light blue - up
trop-fas-toche , merci cathelper, tu aides aussi les insectes.
deux couleur, un blendMode qui switche si dx / dy sont positifs ou négatifs, qu'on peut même multiplier pour obtenir une épaisseur (une teinte plus soutenue voir stroke.colorX /stroke.colorY) et un displace exécuté une seule fois par boucle sur deux canaux.
J'ai tout repris à zéro, une heure après c'était réglé. la vie d'un geek n'est pas toujours facile.
à quoi ça peut bien servir ? te demanderas tu avec ta sagacité habituelle.
et 'tel quel, à rien' je te répondrai aussi comme d'hab'.
Parcontre c'est potentiellement monstrueux vu que dans la source il y a l'ébauche d'un historique des tracés, on peut imaginer s'en servir (pour de vrai ce coup ci) pour faire du morphing :
tel quel le stroke enregistre :
- les coordonnées x, y,
- les couleurX, couleurY
- le blendMode
- la taille du trait (qui est "pullée" de Pinceau pour l'instant)
mais on peut rajouter alpha, le lissage (feather) sans changer grand chose (regardes dans la classe Pinceau, c'est pas trop compliqué). En exportant l'historique des strokes ou bien en faisant un méta-historique qui enregistre plusieurs strokes (pour créer des lignes) en XML, on peut facilement créer des interpolations de formes très très fines à même le bitmap.
c'est très gourmand mais ça impressionnera mamie !
on peut imaginer isoler les lignes de force (sourcils, oreilles, paumettes, bouche) du visage de Godzilla en A et lui dire d'atteindre les positions du visage de Oui-oui en B.
Potentiellemnt, c'est intéressant.
copains
Commentaires
1. Le dimanche 8 juillet 2007 à 22:36, par Seraf
2. Le dimanche 8 juillet 2007 à 22:41, par nicoptere
3. Le lundi 9 juillet 2007 à 01:18, par Seraf
4. Le lundi 9 juillet 2007 à 07:23, par nicoptere
5. Le lundi 9 juillet 2007 à 08:50, par jeanphilippe
6. Le lundi 9 juillet 2007 à 20:15, par nicoptere
7. Le vendredi 13 juillet 2007 à 16:04, par yoxinsky
8. Le vendredi 13 juillet 2007 à 22:09, par Seraf
9. Le samedi 14 juillet 2007 à 00:29, par nicoptere
Ajouter un commentaire