Adsense Banner

BitmapFileMaterial

Papervision3D - Il BitmapFileMaterial

Ci sono diversi modi attraverso i quali si può creare una BitmapMaterial e applicarlo ad un piano.
Si può anche caricare l'immagine e creare un nuovo BitmapMaterial da questa immagine manualmente.
Ma c'è un modo più intelligente per caricare le immagini esterne come materiali. La classe BitmapFileMaterial  eredita da BitmapMaterial e si prende cura di tutti i problemi relativi al caricamento delle immagini esterne.

La creazione di un'istanza BitmapFileMaterial è molto semplice. Ci vogliono solo due parametri come indicato nella tabella seguente:


Parametro  Tipo di dato
Valore di default  Descrizione 
1 url Stringa "" Un URL che punti all'immagine che deve essere caricata come texture di questo materiale.
2 precise Boleano false Consente di scegliere se utilizzare o meno la precisione.

È necessario almeno passare il parametro URL anche senza passare il secondo parametro, poichè false è valore di default e va bene per ora. Fino a quando l'immagine non viene caricata, la struttura avrà un colore nero. Date un'occhiata a come possiamo caricare l'immagine che abbiamo utilizzato nell'esempio precedente.
Chiameremo questo esempio BitmapFileMaterialExample, che è, come tutti gli esempi, basato sulla nostra classe modello. Per prima cosa, configuriamo le importazioni all'inizio della classe.
Inoltre, abbiamo bisogno di avere la classe BitmapFileMaterial e un piano disponibile nel codice:

import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.primitives.Sphere;

E' necessario dichiarare la variabile planet al di fuori di init() per renderla visibile a tutta la classe

private var planet:Sphere;

All'interno del metodo init () istanziamo la BitmapFileMaterial, che prende una stringa come parametro URL per puntare all'immagine che si desidera caricare. Non dimenticare che è necessario disporre di un file situato sul URL impostato, che sia relativo o assoluto, rispetto al file SWF pubblicato.

private function init():void
{
   var material:BitmapFileMaterial = new BitmapFileMaterial ("assets/earthmap1k.jpg");

Il materiale creato sarà assegnato a una nuova sfera, a cui daremo una dimensione di 200, e che consiste di 20 segmenti orizzontali e 20 verticali (va ovviamente creata la cartella assets con contenuta l'immagine earthmap1k.jpg nella cartella dell'eseguibile .swf).

   planet = new Sphere(material,200,20,20);   scene.addChild(plane);}

Questo è tutto il codice che serve al fine di utilizzare la classe BitmapFileMaterial. E' molto più  semplice e senza problemi rispetto al metodo manuale! 

Quando si utilizza un oggetto piano in combinazione con un materiale di tipo file, si devono sempre impostare i parametri di larghezza e altezza. Quando il piani vengono istanziati con un tipo di materiale bitmap, Papervision3D guarda le dimensioni del materiale e prende questo come dimensione per il piano. Papervision3D non conosce le dimensioni della bitmap che è ancora caricamento, quindi, imposta le dimensioni del piano per 0 a 0 con conseguenza, un piano che non si potrà mai vedere.

Quando si pubblica il codice sopraindicato e si guarda molto attentamente la sfera, si noterà che è nera per una frazione di secondo prima che la bitmap caricata vienga mostrata. questo è perché il materiale è nero mentre viene caricato. Un modo per impedire questo comportamento si ottiene evitando il rendering della scena fino a a quando la texture non viene caricata.
Ma come facciamo a sapere quando l'immagine è totalmente caricata? Noi non abbiamo accesso al caricatore che carica l'immagine all'interno della classe BitmapFileMaterial. Un modo per raggiungere questo obiettivo è aggiungere un EventListener all'istanza BitmapFileMaterial e ascoltare gli Eventi FileLoadEvent.LOAD_COMPLETE.
FileLoadEvent è una classe Papervision3D. Ci sono quattro eventi che sono rilevanti per l'ascolto in combinazione con un BitmapFileMaterial:

• FileLoadEvent.LOAD_COMPLETE: inviato non appena la bitmap esterna è stata caricata
• FileLoadEvent.LOAD_PROGRESS: inviato durante il caricamento della bitmap
• FileLoadEvent.LOAD_ERROR: inviato quando l'immagine non è stata trovata
• FileLoadEvent.SECURITY_LOAD_ERROR: inviato quando c'è un errore di sicurezza

Per poter utilizzare FileLoadEvent, è necessario prima importarlo dal  pacchetto org.papervision3d.events.

import org.papervision3d.events.FileLoadEvent;

Possiamo ora aggiungere un EventListener direttamente dopo un'istanza BitmapFileMaterial
e metterci in ascolto di un evento LOAD_COMPLETE.

var material:BitmapFileMaterial = new BitmapFileMaterial ("assets/earthmap1k.jpg");material.addEventListener(FileLoadEvent.LOAD_COMPLETE,loadComplete);

Questo definisce LoadComplete () come metodo del listener. Creiamo questo metodo e tracciamolo. Questa informazione potrebbe essere utile quando si lavora con più istanze di BitmapFileMaterials che caricano le immagini e condividere un singolo metodo LoadComplete ():

private function loadComplete(e:FileLoadEvent):void
{
   trace("Completed loading file: " + e.file);
   startRendering();
}

All'interno di questo metodo che abbiamo chiamato startRendering () in modo che Papervision3D potrà dare inizio il rendering non appena il caricamento è completo. Questo significa che è necessario rimuovere questa chiamata al metodo del costruttore.
Quando si pubblica questo codice, si dovrebbe vedere il seguente output:

Completed loading file: assets/earthmap1k.jpg

E ci si è sbarazzati dello sfarfallio nero della texture!

Filippo Porcari
Author: Filippo PorcariWebsite: http://filippo.porcari.oranjuice.org/Email: Questo indirizzo email è protetto dagli spambots. E' necessario abilitare JavaScript per vederlo.
designer freelance
Sono un graphic designer e mi occupo di pubblicità. Da più di 10 anni dedico le mie energie alla realizzazioni d'immagine aziendale e comunicazione visiva con un'attenzione alle nuove tecnologie del web. Da qualche anno ho scoperto il software open source e mi sono dedicato alla sua introduzione nel mio workflow produttivo ottenendo ottimi risultati.