Creazione di texture mediante le funzioni di disturbo

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Per modificare l'aspetto di una bitmap, potete applicare ad essa un effetto di disturbo, utilizzando il metodo noise() o perlinNoise() . Un effetto di disturbo può essere paragonato alle interferenze statiche che appaiono su uno schermo televisivo non sintonizzato.

Per applicare un effetto di disturbo a una bitmap, utilizzate il metodo noise() . Questo metodo applica un valore di colore casuale ai pixel che si trovano all'interno di un'area specifica di un'immagine bitmap.

Il metodo accetta cinque parametri:

  • randomSeed (int): il numero di scelta casuale che determina il motivo. Nonostante il nome, questo numero di fatto produce lo stesso risultato che si ottiene se si inserisse lo stesso numero. Per ottenere un risultato veramente casuale, utilizzate il metodo Math.random() per assegnare un numero casuale a questo parametro.

  • low (uint): questo parametro fa riferimento al valore più basso da generare per ogni pixel (da 0 a 255). Il valore predefinito è 0. Se si imposta un valore più basso si ottiene un motivo di disturbo più scuro, mentre un valore più alto produce un motivo più luminoso.

  • high (uint): questo parametro fa riferimento al valore più alto da generare per ogni pixel (da 0 a 255). Il valore predefinito è 255. Se si imposta un valore più basso si ottiene un motivo di disturbo più scuro, mentre un valore più alto produce un motivo più luminoso.

  • channelOptions (uint): questo parametro specifica il canale di colore dell'oggetto bitmap a cui viene applicato il motivo di disturbo. Il numero può essere costituito da una combinazione di qualunque valore dei quattro canali di colore ARGB. Il valore predefinito è 7.

  • grayScale (Boolean): se impostato su true , questo parametro applica il valore randomSeed ai pixel della bitmap, eliminando in modo efficace tutti i colori dall'immagine. Il canale alfa non viene modificato da questo parametro. Il valore predefinito è false .

Nell'esempio seguente viene creata un'immagine bitmap a cui viene applicato un motivo di disturbo blu:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise1 extends Sprite 
    { 
        public function BitmapNoise1() 
        { 
            var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); 
            myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); 
            var image:Bitmap = new Bitmap(myBitmap); 
            addChild(image); 
        } 
    } 
}

Se desiderate creare una texture dall'aspetto più organico, utilizzate il metodo perlinNoise() . Questo metodo produce texture organiche molto realistiche ideali per riprodurre fumo, nuvole, acqua, fuoco o esplosioni.

Poiché viene generato da un algoritmo, il metodo perlinNoise() utilizza meno memoria rispetto alle texture basate su bitmap. Tuttavia, può comunque influire sull'uso del processore, rallentando il contenuto e provocando una maggiore lentezza nel ridisegno della schermata rispetto alla frequenza di fotogrammi, in particolare su computer datati. Ciò è dovuto principalmente ai calcoli a virgola mobile necessari per elaborare gli algoritmi del disturbo Perlin.

Il metodo accetta nove parametri (i primi sei sono obbligatori):

  • baseX (Number): determina il valore x (dimensione) dei motivi creati.

  • baseY (Number): determina il valore y (dimensione) dei motivi creati.

  • numOctaves (uint): il numero di ottave o singole funzioni di disturbo da combinare per creare questo disturbo. Un numero più elevato di ottave crea immagini con maggiore dettaglio ma richiede un tempo di elaborazione superiore.

  • randomSeed (int): il numero di scelta casuale funziona allo stesso modo di quando viene utilizzato nella funzione noise() . Per ottenere un risultato veramente casuale, utilizzate il metodo Math.random() per assegnare un numero casuale a questo parametro.

  • stitch (Boolean): se il valore è true , questo metodo tenta di attenuare i bordi di transizione dell'immagine per creare delle texture uniformi da utilizzare come riempimenti bitmap affiancati.

  • fractalNoise (Boolean): questo parametro fa riferimento ai bordi dei gradienti che vengono generati dal metodo. Se è impostato su true , il metodo genera un disturbo frattale che attenua i bordi dell'effetto. Se è impostato su false , genera turbolenza. Un'immagine con turbolenza presenta delle discontinuità visibili nel gradiente che possono fornire una migliore approssimazione per effetti visivi più nitidi come le fiamme o le onde del mare.

  • channelOptions (uint): il parametro channelOptions funziona allo stesso modo di quando viene utilizzato nel metodo noise() . Specifica il canale di colore (della bitmap) a cui viene applicato il motivo di disturbo. Il numero può essere costituito da una combinazione di qualunque valore dei quattro canali di colore ARGB. Il valore predefinito è 7.

  • grayScale (Boolean): il parametro grayScale funziona allo stesso modo di quando viene utilizzato nel metodo noise() . Se è impostato su true , applica il valore randomSeed ai pixel della bitmap, eliminando in modo efficace tutti i colori dall'immagine. Il valore predefinito è false .

  • offsets (Array): un array di punti che corrispondono agli offset x e y di ciascuna ottava. Modificando questi valori di offset, è possibile effettuare lo scorrimento fluido dell'immagine. Ogni punto nell'array di offset modifica la funzione di disturbo di un'ottava specifica. Il valore predefinito è null .

Nell'esempio seguente viene creato un oggetto BitmapData da 150 x 150 pixel che chiama il metodo perlinNoise() per generare un effetto nuvola verde e blu:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise2 extends Sprite 
    { 
        public function BitmapNoise2() 
        { 
            var myBitmapDataObject:BitmapData = 
                new BitmapData(150, 150, false, 0x00FF0000); 
             
            var seed:Number = Math.floor(Math.random() * 100); 
            var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE  
            myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); 
             
            var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); 
            addChild(myBitmap); 
        } 
    } 
}