Code

Displacement Mapping en AS3 avec Papervision 2.0

DisplaceMapDemo Screenshot

La sortie de Papervision 2.0 - Great White la semaine dernière a repoussé encore un peu plus les limites de flash (hum quelle intro…) en apportant pas mal de nouveautés (Shaders, Bump-mapping, ASCollada pour importer des mesh skinné, Frustum culling..etc). Mais Great White c’est aussi une gestion ameillorée des évenements souris (via la classe InteractiveUtils) permettant, par exemple de récupérer facilement les coordonnées de projection (u,v) d’un clic de souris sur un objet 3D.

Cette dernière nouveauté qui est passé presque inaperçue à la sortie de GW, m’a donné l’idée de faire une classe de Displacement Mapping. Fonctionnalité absente dans papervision et pourtant trés répandue en 3D. Pour ceux qui ne voient pas ce que c’est, ça consiste à obtenir une déformation 3D grâce aux niveaux de gris d’une image. C’est le procédé utilisé pour faire des terrains ou pour faire du brush-modeling avec Z-brush par exemple. Du coup je me suis plongé dans PV3D 2.0 et y’a pas à tortiller, c’est vraiment une putain de release! (Mis à part le fait que ce soit une alpha non documentée grrrr…).

Pour illustrer cette fonctionnalité et ce qu’elle peut permettre de faire, j’ai fais une micro-appli qui montre quelques exemples d’application. Le système de displacement fonctionne sans lag dans la plupart des cas, mais là l’appli est assez lourde et j’ai encore du mal avec la gestion des ressources de l’AS3, donc il faut un bon pc pour la démo :

La démo :
http://cyril.diagne.free.fr/lab/dmdemo/

Les sources :
http://cyril.diagne.free.fr/lab/src/displace_demo.rar

Bon bon tout ça c’est bien beau, mais comment ça marche ?

Le procédé du displacement mapping est assez simple :

- On charge un display object (jpg, movieclip, bitmapdata..etc)
- On redimensionne l’image avec une matrice pour avoir le meme nombre de pixel que de vertex sur le plan. Ca permet de calculer plus facilement/rapidement les moyennes de couleurs.
- Dans un double for, on parcours chaque pixel de l’image, on récupère la valeur du niveau de gris avec getPixel() et on convertit la valeur renvoyée en base 10 (pour avoir un nombre entier allant de 0 à 255).
- Ensuite on applique simplement cette valeur à la propriété z du vertex correspondant sur notre plane. Le seul vrai challenge étant de trouver comment PV3D organise ses vertex dans le tableau geometry.vertices qui est à 1 seule dimension.

Et voilà, le process étant relativement *léger* niveau ressource, on peut facilement tweener la translation ou l’appliquer en ENTER_FRAME. Encore une fois, l’appli de démo rame non pas à cause du displacement, mais à cause de tout le crappy code que j’ai mis à coté :D

Voilà voilà, si vous avez des commentaires/questions/conseils…

Le 15 décembre 2007 par kikko

Tags = ["", "", "", ""];

15 commentaires pour “Displacement Mapping en AS3 avec Papervision 2.0”

  1. Nico dit :

    Hardcore hardcore hardcore !

  2. Ken dit :

    Magnifique mec tu déchires tout comme d’hab. Enfin une application pv3d avec les mêmes usages que ceux qui ont l’habitude de la 3D pure !

    Après t’en avoir déjà parlé plein a maintes reprises je m’incline une dernière fois très bas avec un profond respect. Tu es notre demi-dieu à nous.

    (J’ai refait le faille de san andreas merci).

    Ps : Fait une trad en anglais trou de balle.

  3. Displacement Mapping en AS3 | Gobz dit :

    [...] Pour les sources, explications, louanges et déclarations d’amour ça se passe du côté du string dans l’array. [...]

  4. Gil dit :

    Bon, faut l’envoyer à Carlos ou sur le blog Pv3D, hein Cowboy.

  5. Mem's dit :

    Héhé hop j’en parle sur la mailing list… avec mon anglais pourrave :D

  6. malasse dit :

    j’avoue, trad anglaise obligatoire, c’est du lourd.

  7. simon dit :

    c’est du lourd, bien joué mon ptit voisin de cours (je pourrais dire plus tard “il était assis à coté de moi en cours…”) …

  8. anto dit :

    Et moi… j’ai fait du papervision avec lui dans mon projet de fin d’année la grande classe !
    J’hésite même à le mettre sur mon CV.
    D’ailleurs si tu peux me faire une lettre de recommandation pour mes futurs entretiens ^^
    Kikko powaah !!!

  9. nerik dit :

    oh yeah. Beau boulot (j’ai les glandes)

  10. nerik dit :

    et diggé et stumbleuponé, au passage

  11. Antoine dit :

    Putain c’est un bon ce ptit bounty !
    On s’en lasse pas de cette chtite démo !

  12. rom1 dit :

    bonjour

    j ai telecharger les sources de Carlos sur le blog Pv3D et je n arrive pas a faire marcher le fla.
    erreurs de compilation sur erruers de compilations…
    ovveride non compatible, ect

    quelq un peux t il m’eclairer??

    merci

  13. kikko dit :

    Il faut avoir la version 2.0 (GreatWhite) de Pv3D qui n’est téléchargeable qu’en béta sur leur svn il me semble (leur page google code ne propose que la version 1.5).

    L’url : http://papervision3d.googlecode.com/svn/trunk/branches/GreatWhite/

  14. Sandro dit :

    hello kikko,

    very nice work!..
    My only Question is how can i put MovieMaterial on the Plan???

  15. kikko dit :

    @Sandro -> Thks !
    To put a movieMaterial on the plane, all you have to do is to create a new MovieMaterial and then give it to the constructor of your plane :
    var testMovieMat:MovieMaterial = new MovieMaterial(theMC);
    var testPlane:Plane = new Plane(testMovieMat);

    if you want the displacement to be animated you have to set ” testMovieMat.animated = true ” and then apply de the deformation on ENTER_FRAME.

    Hope it helps !

Laisser un commentaire