Visualizza i modelli 3DS con Away3D 4.0 Beta

In questo tutorial impareremo come caricare e visualizzare un file di modello 3DS in Flash, utilizzando l'accelerazione hardware Away3D 4.0 beta e Stage3D della GPU.


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:

Clicca per scaricare i file demo.


introduzione

Per utilizzare questo tutorial è necessario disporre di un modello 3D (esportato come file .3ds) e della sua trama (come file immagine).

Ho creato un semplice modello 3D di una teiera in Autodesk 3DS Max e l'ho esportato in un file chiamato Teapot.3DS insieme al suo file di texture separato, teapot.jpg. Puoi trovare entrambi i file nel download sorgente.

Dovrai scaricare un pacchetto SWC di Away3D 4.0.0 beta (puoi trovare questo SWC anche nei file sorgente).

E devi sapere che la versione beta di Away3D 4.0.0 utilizza le nuove funzionalità Stage3D di Adobe Flash, il che significa che può utilizzare la GPU per l'accelerazione grafica 3D.

Stiamo costruendo questa demo usando puro AS3, compilato in FlashDevelop (leggi di più qui). FlashDevelop è un IDE AS3 gratuito, sebbene sia solo per Windows. Se si preferisce utilizzare un altro IDE, sarà comunque possibile seguire questo tutorial.


Passaggio 1: crea un nuovo progetto

Se non lo hai già fatto, assicurati di scaricare e installare FlashDevelop. Aprilo e inizia un nuovo progetto AS3.

FlashDevelop creerà per te un modello di template AS3 vuoto. Useremo la classe Main per tutto il nostro codice.


Passaggio 2: Opzioni del compilatore

Vai nel menu Progetto, scegli Proprietà e modifica alcune opzioni:

  1. Imposta la piattaforma di destinazione su Flash Player 11.1.
  2. Modifica la dimensione del file SWF a 550 x 400 px.
  3. Imposta il colore di sfondo sul nero.
  4. Cambia il FPS a 40.

Se vogliamo eseguire questo tutorial dal codice HTML incorporato, dobbiamo includere il parametro wmode = diretta nei parametri dell'oggetto Flash nel file HTML. Sembrerà come questo:

    

In questo tutorial caricheremo il file 3DS dalla memoria locale (piuttosto che da un server web), quindi dobbiamo modificare alcune impostazioni nella scheda Opzioni del compilatore. Impostato Utilizzare i servizi di rete a falso.


Passaggio 3: aggiungi la libreria Away3D

Ottenere Away3D-core-fp11_4_0_0_beta.swc dai file di origine, o scaricarlo dal sito di Away3D.

Copia quel file nel tuo progetto lib elenco.

In FlashDevelop, fare clic con il pulsante destro del mouse sul file SWC e selezionare Aggiungi alla libreria.


Passaggio 4: importazioni

Ora iniziamo a programmare con il nostro Main.as file. Per iniziare, dobbiamo importare i file di libreria necessari per il programma per configurare il motore Away3D e i componenti Flash. Ce ne sono alcuni, quindi cerchiamo di toglierli di mezzo:

 // 3DS Model Viewer Tutorial // di Vu Hoang Minh - www.3dgameflash.com // Creato per il pacchetto active.tutsplus.com // Away3D classes import away3d.cameras.lenses.PerspectiveLens; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.entities.Mesh; import away3d.events.LoaderEvent; import away3d.loaders.Loader3D; import away3d.loaders.parsers.Max3DSParser; import away3d.materials.TextureMaterial; import away3d.textures.BitmapTexture; // Classi Flash generali per la visualizzazione e l'interazione import flash.display.Bitmap; import flash.display.MovieClip; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Vector3D; import flash.text.TextField; // Classi per caricare il file 3DS dal disco rigido import flash.display.SimpleButton; import flash.events.IOErrorEvent; import flash.net.FileFilter; import flash.net.FileReference; import flash.net.URLRequest; import flash.system.Security;

Passaggio 5: inizializzazione del programma

Iniziamo. Dichiareremo le variabili di cui avremo bisogno, inizializzeremo il motore 3D e configuriamo il pulsante "Sfoglia" ed eseguiamo il debug del campo di testo dell'output.

 public class Main extends Sprite file var privato: FileReference; private var view3d: View3D; loader var privato: Loader3D; private var labelDebug: TextField; private var object3d: Mesh; funzione pubblica Main (): void // boilerplate caricamento del codice if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  funzione privata init (e: Event = null): void // ci consente di caricare un file locale Security.allowDomain ("*"); removeEventListener (Event.ADDED_TO_STAGE, init); // init 3D engine view3d = new View3D (); view3d.camera.lens = new PerspectiveLens (); view3d.camera.z = 100; addChild (View3D); // caricatore 3D initLoader (); // Pulsante per aprire il browser dei file var mcBrowse: MovieClip = new MovieClip (); mcBrowse.graphics.beginFill (0xEEEEEE); mcBrowse.graphics.drawRoundRect (1, 2, 100, 25, 7, 7); mcBrowse.graphics.endFill (); var labelBrowse: TextField = new TextField (); labelBrowse.text = "Sfoglia"; mcBrowse.addChild (labelBrowse); mcBrowse.mouseChildren = false; mcBrowse.buttonMode = true; labelBrowse.x = 25; mcBrowse.addEventListener (MouseEvent.CLICK, onClick_mcBrowse); addChild (mcBrowse); // debug output labelDebug = new TextField (); labelDebug.text = "..."; labelDebug.textColor = 0xff0000; labelDebug.selectable = false; labelDebug.y = mcBrowse.height / 2; labelDebug.width = 600; addChild (labelDebug); // file file = new FileReference (); 

Nelle righe 25-29 inizializziamo i componenti grafici Away3D. Creiamo un nuovo View3D (un contenitore che memorizza la fotocamera e gli oggetti), ne configuriamo l'obiettivo e la fotocamera e lo aggiungiamo all'elenco di visualizzazione.

Dopodiché creiamo un pulsante Sfoglia: ne tracciamo lo sfondo, aggiungiamo la sua etichetta, lo configuriamo e lo aggiungiamo all'elenco di visualizzazione.

Per rendere più facile tenere traccia dello stato di caricamento di 3DS, creiamo un'etichetta di debug, che è un semplice campo di testo.

Infine, inizializziamo a File di riferimento istanza per gestire la navigazione per il file 3DS.


Passaggio 6: inizializzazione del caricatore 3D

La prossima cosa importante che dobbiamo fare è creare un caricatore di modelli 3D.

 funzione privata initLoader (): void // cancella tutto removeEventListener (Event.ENTER_FRAME, onEnterFrame); while (view3d.scene.numChildren> 0) view3d.scene.removeChild (view3d.scene.getChildAt (0));  // avvia un nuovo caricatore 3D Loader3D.enableParser (Max3DSParser); loader = new Loader3D (); loader.addEventListener (LoaderEvent.RESOURCE_COMPLETE, onComplete_loader); loader.addEventListener (LoaderEvent.LOAD_ERROR, onError_loader); view3d.scene.addChild (caricatore); // config camera view3d.camera.lookAt (loader.position); 

Questa funzione ha tre sezioni:

  1. Per prima cosa, chiariamo tutto, nel caso in cui il nostro programma sia già stato eseguito.
  2. Dopo di ciò, inizializziamo un nuovo Loader3D istanza, e aggiungi ascoltatori ad esso che si attivano quando genera un errore quando un file 3D è completamente caricato. Per renderlo visibile, lo aggiungiamo al View3DLa scena di.
  3. Per assicurarci di poter effettivamente vedere l'oggetto una volta caricato, diciamo alla telecamera di guardarlo.

Passaggio 7: gestisci tutti gli eventi

Successivamente, aggiungeremo tutte le funzioni del gestore di eventi, che hanno tutte a che fare con il caricamento del file 3DS.

 funzione privata onClick_mcBrowse (e: MouseEvent): void file.browse ([nuovo FileFilter ("3DS", "* .3ds")]); file.addEventListener (Event.SELECT, onFileSelected); file.addEventListener (SecurityErrorEvent.SECURITY_ERROR, onSecurityError); file.addEventListener (IOErrorEvent.IO_ERROR, onIOError);  private function onSecurityError (e: Event): void labelDebug.text + = ".Security Error!";  funzione privata onIOError (e: IOErrorEvent): void labelDebug.text + = ".File non trovato Errore!";  funzione privata onFileSelected (e: Event): void labelDebug.text = "File:" + file.name; file.removeEventListener (Event.SELECT, onFileSelected); file.addEventListener (Event.COMPLETE, onFileLoaded); file.load ();  funzione privata onFileLoaded (e: Event): void file.removeEventListener (Event.COMPLETE, onFileLoaded); initLoader (); loader.loadData (e.target.data);  funzione privata onError_loader (e: LoaderEvent): void trace ("Errore durante il caricamento del file ..."); labelDebug.text + = ".Loading Error";  funzione privata onComplete_loader (e: LoaderEvent): void trace ("File 3D caricato"); labelDebug.text + = ".Complete.Rendering ..."; loader.removeEventListener (LoaderEvent.RESOURCE_COMPLETE, onComplete_loader); loader.removeEventListener (LoaderEvent.LOAD_ERROR, onError_loader); object3d = Mesh (loader.getChildAt (0)); view3d.scene.addChild (object3d); loader.dispose (); loader = null; addEventListener (Event.ENTER_FRAME, onEnterFrame); 

Quando l'utente fa clic sul pulsante Sfoglia, viene visualizzata la finestra di dialogo Sfoglia file, che utilizza a FileFilter per limitare i file mostrati a quelli con a .3ds estensione. Aggiungiamo diversi listener di eventi a questa finestra di dialogo, in modo che possiamo rilevare quando viene rilevato un file o se si verifica un errore.

Dopo che un file è stato selezionato, lo carichiamo sul File di riferimento istanza che abbiamo inizializzato in precedenza. Una volta che ha caricato, noi chiamiamo il initLoader () funzione che abbiamo definito nel passaggio precedente, che carica il nostro modello 3D.

In questo momento, ci sono due possibili stati che possiamo cogliere:

  • Uno è lo stato di "errore", il che implica che il nostro programma non può caricare il file del modello 3D (forse il percorso è errato o il file di texture della mappa è sbagliato ...).
  • L'altro è l'evento "caricato con successo", su cui viene eseguito il cast del file caricato su Maglia e aggiungilo alla scena di View3D.

Per liberare la memoria e riutilizzarla in un secondo momento, dovremmo disporre del nostro caricatore.

Alla fine del codice sopra (assumendo il file caricato) aggiungiamo un ENTER_FRAME evento, che useremo per rendere l'oggetto. Ora scriveremo questo gestore.


Passaggio 8: avviare il ciclo di rendering

Ora che tutto è stato inizializzato, siamo pronti a renderlo tutto. Ogni fotogramma, faremo ruotare l'oggetto 3D (ruotare) e chiamare il render () funzione di View3D per aggiornare il display.

 funzione privata onEnterFrame (e: Event): void object3d.yaw (1); // yaw di una unità view3d.render (); 

Passaggio 9: compilazione ed esecuzione!

Quasi fatto! Compila il tuo SWF con F5 e guarda il tuo risultato finale. Così interessante, giusto?

Puoi fare piuttosto che ruotare l'oggetto: prova a chiamare object3d.moveFoward (10) o object3d.pitch (1). Potresti anche farlo in risposta a un movimento del mouse o alla pressione di un tasto.

Solo per riferimento e per assicurarti di aver utilizzato i nomi file e le posizioni corrette per tutto, ecco come dovrebbe apparire il tuo progetto FlashDevelop:


Conclusione

Abbiamo completato il primo tutorial 3D di base sulla nuovissima funzione Accelarate 3d di Adobe. Accolgo un caloroso benvenuto a tutti i lettori per mettermi in contatto con me tramite i commenti, o tramite il mio sito Web, in qualsiasi momento. Grazie per aver letto. Arrivederci alla prossima. Buona fortuna e buon divertimento!