Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 36 di 51
  • livello principiante
Indice lezioni

Utilizzo di ColorTransform

Dopo aver visto come agire su un unico colore della skin, vediamo come poter variare la trasparenza su facce con texture
Dopo aver visto come agire su un unico colore della skin, vediamo come poter variare la trasparenza su facce con texture
Link copiato negli appunti

Per quanto alcuni colori possano risultare gradevoli, la MixedSkin è comunque piuttosto limitata e quindi spesso potremmo voler utilizzare delle texture. Qualora volessimo applicare trasformazioni ai colori o alla trasparenza di una TextureSkin però, non avremmo a disposizione dei parametri appositi: dovremo invece utilizzare il ColorTransform (dal package flash.geom) oppure un filtro ColorMatrix. Vediamo allora come utilizzarli! Per primo analizzeremo il ColorTransform.

Gli elementi BitmapData di Flash possono essere più o meno trasparenti, sfruttando il loro canale alpha: questo è il modo più semplice per ottenere una texture con trasparenza. La guida di Flash offre questo esempio:

myBitmapData.colorTransform( myBitmapData.rectangle, new ColorTransform(1, 0, 0, 1, 255, 0, 0, 0));

Dove i parametri, da sinistra a destra, sono:

  • Moltiplicatore del rosso
  • Moltiplicatore del verde
  • Moltiplicatore del blu
  • Moltiplicatore dell'alpha
  • Ammontare di rosso
  • Ammontare di verde
  • Ammontare di blu
  • Ammontare dell'alpha

Quando questo comando viene applicato a una bitmap, il nuovo colore è calcolato per ogni pixel, moltiplicando il vecchio valore per il moltiplicatore e aggiungendo l'ammontare di quel colore, quindi:

nuovo colore = moltiplicatore del colore * vecchio colore + ammontare del colore

Nel caso in cui un valore risultasse maggiore di 255, questo verrebbe ridotto a 255 (che è il massimo ammontare di ogni colore).

Per sfruttare il colorTransform all'interno di una skin, possiamo utilizzare questo codice:

Listato 46. Usa colorTransform all'interno di una skin

var colTrans = new ColorTransform(1,1,1,1,0,0,0,-155);
skin.texture.colorTransform( skin.texture.rectangle, colTrans );
skin.setLightingEnable(true);

Vediamo un esempio pratico. Per prima cosa modifichiamo la funzione createScene in questo modo:

Listato 47. Crea la scena con le immagini e il cubo

function createScene(Void):Group{
    var g:Group = new Group();
    this.attachMovie("image","imageholder",this.getNextHighestDepth());
    
    // Nascondiamo l'immagine sullo stage
    imageholder._alpha = 0;
    texture = new BitmapData( imageholder._width, imageholder._height);
    texture.draw( this.imageholder );
    skin = new TextureSkin( texture );
    
    // Creiamo il cubo
    box = new Box(80,80,80,'tri',2);
    box.setSkin( skin );
    box.setBackSkin( skin );
    
    // Applichiamo le trasformazioni
    tg.addChild(box);
    g.addChild(tg);
    return g;
}

"image" è un movieclip che abbiamo inserito nella libreria e che contiene al suo interno una immagine bitmap. Viene inserito sullo stage con nome istanza "imageholder", quindi viene convertito in un oggetto BitmapData. A questo punto sfruttando questo oggetto vi inseriamo l'immagine e lo sfruttiamo come texture per la nostra skin; le variabili di texture e skin sono globali, in modo da poterle raggiungere da ogni punto del filmato.

Creiamo infine skin e cubo, che aggiungiamo a un TransformGroup globale (tg).

Poichè vogliamo modificare l'alpha dell'immagine utilizzata come skin, dobbiamo impostare i nuovi comandi per l'alphaSlider. Aggiungeremo anche un pulsante, per attivare o disattivare il back face culling. Ecco la funzione setUpControls:

Listato 48. Imposta i controlli per il mouse e inserisce un pulsante per impostare il back face

function setUpControls(){
    // Controlli per la rotazione col mouse, come nell'esempio precedente
    Mouse.addListener(this);
        onMouseDown = function() {
        mousedown = true;
        mouseX = _xmouse;
        mouseY = _ymouse;
    };
    onMouseUp = function() {
        mousedown = false;
        mouseX = _xmouse;
        mouseY = _ymouse;
    };

    // Controlli per lo slider
    alphaText.text = alphaSlider.value;
    var alphaCh:Object = new Object();
    alphaCh.onChange = setAlpha;
    alphaSlider.addListener( alphaCh );
    
    // Pulsante per attivare-disattivare il back face culling
    cullingButton.onRelease = switchBackCulling;
}

Possiamo notare che al cambiamento del valore dello slider abbiamo impostato un richiamo alla funzione setAlpha, il cui codice è:

Listato 49. Crea un oggetto colorTransform

function setAlpha( evt ){
    var alphaDiff:Number = evt.value;
    alphaText.text = alphaDiff;
    var colTrans:ColorTransform = new ColorTransform( 1,1,1,1,0,0,0, alphaDiff );
    var textureClone:BitmapData = texture.clone();
    textureClone.colorTransform( texture.rectangle, colTrans );
    skin.texture = textureClone;
}

Cosa fa questo codice? Semplicemente crea un oggetto colorTransform, dove tutti i moltiplicatori sono impostati su 1 e i valori dei colori sono impostati a 0, tranne quello dell'alpha. Applicando questo oggetto ad una bitmap, otteniamo che i colori non cambino in alcun modo, ma la trasparenza sia impostata sul valore della variabile alphaDiff, che è che il valore impostato dall'utente con lo slider.

Può sembrare strano che il cambiamento venga applicato a una copia della texture e non direttamente alla skin. In realtà il motivo è molto semplice: se applicassimo l'effetto direttamente alla skin, verrebbero variate alcune proprietà (come saturazione e contrasto), che saranno poi modificate in eventuali trasformazioni successive, utilizzando quelle precedenti come base, pertanto varierebbe l'aspetto dell'immagine e non solo la sua trasparenza.

Applicando invece il ColorTransform a una copia della texture "pulita" definita nella funzione createScene e applicando poi questa copia come nuova texture, non abbiamo alcun effetto indesiderato. Ecco infatti il risultato del codice visto finora:

Utilizzo della trasparenza su una texture

"© Petit Publications 2006" - diritti riservati

Ti consigliamo anche