Première étape : gérer la webcam

package com.phiphou.application
{
//import des classes nécessaires
import flash.media.Camera;
import flash.media.Video;
 
 
     public class WebCam
     {
       //Création des objets video et caméra
       public var video:Video
       public var camera:Camera;
       
     public function WebCam()
     {
	//Connexion à la WebCam
        camera = Camera.getCamera();
        //Paramètre de la webcam (taille,fps,etc.)
	camera.setMode(320,240,25,false);
        //On créé l'objet vidéo qui recevra les données de la webcam
	video = new Video(320, 240);
        //On attache à cet objet la webcam
	video.attachCamera(camera);
	//On affiche la vidéo
	addChild(video);
     }
}
}

Rien de bien compliqué, comme vous pouvez le voir...

Passons maintenant au filtre de displacement.

Une map de displacement permet de déformer une image en fonction des données d'une autre image. C'est un peu le même principe qu'un masque, sauf que l'on gèrera une déformation et non pas une transparence.

Voyons comment appliquer cela :

package com.phiphou.application
{
//import des classes nécessaires
import flash.display.*;
import flash.filters.*;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import flash.geom.Matrix;
 
 
     public class Displac
     {
     //On prépare notre dégradé
     var fillType:String = GradientType.RADIAL;
     var matr:Matrix = new Matrix();
     matr.createGradientBox(320,240,0,0,0);
     var colors:Array=[0x000000,0xffffff];
     var alphas:Array=[100,100];
     var ratios:Array=[0,255];
     var spreadMethod:String = SpreadMethod.REFLECT;
     var interpolationMethod:String = "RGB";
     var focalPointRatio:Number = 0;	
     //On créé une shape, que l'on remplit avec notre dégradé
     var gradient: Shape = new Shape();				
     gradient.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod,interpolationMethod,focalPointRatio);  
     gradient.graphics.drawRect(0,0,320,240);
     //On dessine cette shape sur un Bitmap
     public var MyBitmapData:BitmapData = new flash.display.BitmapData(320, 240, false, 0x00000000);
     MyBitmapData.draw(gradient);
     public var :MyBitmap = new Bitmap();
     MyBitmap.bitmapData =MyBitmapData;
     //On ajoute le Bitmap à la displayList
     addChild(MyBitmap);
     //On créé maintenant notre filtre de displacement
     var displacFilter:DisplacementMapFilter = new DisplacementMapFilter();
     //On l'affecte à notre bitmap
     displac.mapBitmap = MyBitmap.bitmapData;
     //On spécifie les paramètres du filtre de displacement   
     displac.mapPoint = new flash.geom.Point(0, 0);
     displac.mode = "clamp";
     displac.scaleX = 20;
     displac.scaleY = 20;
     displac.componentX = 1;
     displac.componentY = 1;
     displac.alpha = 1;
     //On ajoute ce filtre à la liste des filtres
     filters = [displac];
}
}

La encore, je pense que les commentaires parlent d'eux même.

Voyons enfin rapidement le PerlinNoise. Cet algorithme interpole et combine des fonctions de bruit aléatoire individuelles, appelées octaves. Tout comme les octaves musicales, la fréquence de chaque fonction d’octave est doublée par rapport à celle qui la précède. Le bruit Perlin est décrit comme étant une "somme de bruit fractale" car il combine plusieurs ensembles de données de bruit avec différents niveaux de détails.

En pratique, cela donne :

UnBitmapData.perlinNoise(100, 100, 3, 20, true, false, 8, true, [offset]);

Voila qui est plutôt simple...En revanche, pour les paramètres, il faut tâtonner pour trouver l'effet recherché.

Combinons maintenant ces trois fonctions dans une seule petite application.

Le code :

package com.phiphou.application
{
import mx.core.UIComponent;
import flash.events.Event;
import flash.filters.DisplacementMapFilter;
import flash.media.Camera;
import flash.media.Video;
import flash.geom.Point;
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
 
public class WebCamDisplacement extends UIComponent
{
	public var videoBitmap:Bitmap = new Bitmap();
	public var displacBitmap:Bitmap = new Bitmap();
	    
	public var videoBitmapData:BitmapData = new BitmapData(320, 240, false, 0x00000000);
	public var displacBitmapData:BitmapData = new BitmapData(320, 240, false, 0x00000000);
 
	public var displacFilter:DisplacementMapFilter = new DisplacementMapFilter();
	public var offset:Point = new Point(0,0);
 
	public var video:Video
	public var camera:Camera;
		
        public function WebCamDisplacement()
        {	
	camera = Camera.getCamera();
	camera.setMode(320,240,25,false);
	video = new Video(320, 240);
	video.attachCamera(camera);
			
        videoBitmap.bitmapData = videoBitmapData;
	displacBitmap.bitmapData = displacBitmapData;
			
	displacFilter.mapBitmap = displacBitmapData;
			
	displacFilter.mode = "clamp";
	displacFilter.scaleX = 20;
	displacFilter.scaleY = 20;
	displacFilter.componentX = 1;
	displacFilter.componentY = 1;
	displacFilter.alpha = 1;
			
	filters = [displacFilter];
        
 	addChild(videoBitmap);
 
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
	}
        
  
       public function onEnterFrame(event:Event):void
       {
    	videoBitmapData.draw(video);
  			
	offset.x += 5;
	offset.y += 5;
 
	displacBitmapData.perlinNoise(100, 100, 3, 20, true, false, 8, true, [offset]);
	}     
    }
}

Pour l'utiliser :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
layout="absolute" xmlns:phiphou="com.phiphou.application.*"
 width="320" height="240">
<phiphou:WebCamDisplacement/>
</mx:Application>

Ce qui nous donne :

;

Voilà pour aujourd'hui...