Bekijk 3DS-modellen met Away3D 4.0 bèta

In deze zelfstudie leren we hoe we een 3DS-modelbestand in Flash kunnen laden en weergeven, met behulp van Away3D 4.0 beta en Stage3D's GPU hardwareversnelling.


Eindresultaat voorbeeld

Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:

Klik om de demo-bestanden te downloaden.


Invoering

Om deze tutorial te gebruiken, moet je een 3D-model hebben (geëxporteerd als een .3ds-bestand) en de structuur ervan (als een afbeeldingsbestand).

Ik heb een eenvoudig 3D-model van een theepot gemaakt in Autodesk 3DS Max en geëxporteerd naar een bestand met de naam Teapot.3DS samen met zijn afzonderlijke textuurbestand, teapot.jpg. Je kunt beide bestanden vinden in de brondownload.

U moet een pakket SWC van Away3D 4.0.0 beta downloaden (u kunt deze SWC ook vinden in de bronbestanden).

En u moet weten dat de Away3D 4.0.0-bètaversie de nieuwe Stage3D-functies van Adobe Flash gebruikt, wat betekent dat deze de GPU voor 3D-grafische versnelling kan gebruiken.

We gaan deze demo bouwen met pure AS3, gecompileerd in FlashDevelop (lees hier meer over). FlashDevelop is een gratis AS3 IDE, hoewel het alleen Windows is. Als u liever een andere IDE gebruikt, kunt u deze zelfstudie nog steeds volgen.


Stap 1: Maak een nieuw project

Als je dit nog niet hebt, download en installeer dan FlashDevelop. Open het en start een nieuw AS3-project.

FlashDevelop maakt een leeg AS3-sjabloonproject voor u. We gebruiken de hoofdklasse voor al onze code.


Stap 2: Compileropties

Ga naar het projectmenu, kies Eigenschappen en verander een paar opties:

  1. Stel het doelplatform in op Flash Player 11.1.
  2. Wijzig de SWF-grootte in 550x400 px.
  3. Zet de achtergrondkleur op zwart.
  4. Verander de FPS in 40.

Als we deze zelfstudie willen uitvoeren vanuit de HTML-insluitcode, moeten we de parameter opnemen wmode = rechtstreekse in de parameters van het Flash-object in het HTML-bestand. Het ziet er als volgt uit:

    

In deze zelfstudie laden we het 3DS-bestand van lokale opslag (in plaats van van een webserver), dus moeten we sommige instellingen wijzigen op het tabblad Compileeropties. set Gebruik netwerkdiensten naar vals.


Stap 3: Voeg Away3D Library toe

Krijgen Away3D-core-fp11_4_0_0_beta.swc van de bronbestanden, of download het van de Away3D-site.

Kopieer dat bestand naar uw project lib directory.

Klik in FlashDevelop met de rechtermuisknop op het SWC-bestand en kies Toevoegen aan bibliotheek.


Stap 4: Importeert

Laten we nu gaan coderen met onze Main.as het dossier. Om te beginnen moeten we de benodigde bibliotheekbestanden voor het programma importeren om de Away3D-engine en de Flash-componenten in te stellen. Er zijn er nogal wat, dus laten we ze uit de weg ruimen:

 // 3DS Model Viewer Tutorial // door Vu Hoang Minh - www.3dgameflash.com // Gemaakt voor active.tutsplus.com package // 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; // Algemene Flash-klassen voor weergave en interactie 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; // Klassen voor het laden van het 3DS-bestand van de harde schijf importeren flash.display.SimpleButton; import flash.events.IOErrorEvent; import flash.net.FileFilter; import flash.net.FileReference; import flash.net.URLRequest; import flash.system.Security;

Stap 5: Initialiseer programma

Laten we beginnen. We zullen de variabelen declareren die we nodig zullen hebben, de 3D-engine initialiseren en de knop "Bladeren" instellen en het veld voor de foutopsporing van de foutopsporing.

 public class Hoofd breidt privé var-bestand: FileReference uit; private var view3d: View3D; private var loader: Loader3D; private var labelDebug: TextField; privé var object3d: Mesh; public function Main (): void // boilerplate loading code if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  private function init (e: Event = null): void // staat ons toe om een ​​lokaal bestand Security.allowDomain ("*") te laden; removeEventListener (Event.ADDED_TO_STAGE, init); // init 3D engine view3d = nieuwe View3D (); view3d.camera.lens = new PerspectiveLens (); view3d.camera.z = 100; addChild (View3D); // 3D loader initLoader (); // Knop om bestandsbrowser te openen var mcBrowse: MovieClip = nieuwe MovieClip (); mcBrowse.graphics.beginFill (0xeeeeee); mcBrowse.graphics.drawRoundRect (1, 2, 100, 25, 7, 7); mcBrowse.graphics.endFill (); var labelBrowse: TextField = new TextField (); labelBrowse.text = "Bladeren"; 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); // bestandsbestand = nieuw FileReference (); 

In regel 25-29 initialiseren we de grafische componenten van de Away3D. We maken een nieuwe View3D (een container waarin de camera en objecten worden opgeslagen), configureren de lens en camera en voegen deze toe aan de displaylijst.

Daarna maken we een knop Bladeren: we tekenen de achtergrond, voegen het label toe, configureren het en voegen het toe aan de displaylijst.

Om het gemakkelijk te maken de 3DS-laadstatus bij te houden, maken we een debug-label, wat een eenvoudig tekstveld is.

Ten slotte initialiseren we een FileReference bijvoorbeeld om browsen voor het 3DS-bestand af te handelen.


Stap 6: Initialiseer 3D Loader

Het volgende belangrijke wat we moeten doen is een 3D-modellader maken.

 private function initLoader (): void // wis alles removeEventListener (Event.ENTER_FRAME, onEnterFrame); while (view3d.scene.numChildren> 0) view3d.scene.removeChild (view3d.scene.getChildAt (0));  // init nieuwe 3D-lader Loader3D.enableParser (Max3DSParser); loader = nieuwe Loader3D (); loader.addEventListener (LoaderEvent.RESOURCE_COMPLETE, onComplete_loader); loader.addEventListener (LoaderEvent.LOAD_ERROR, onError_loader); view3d.scene.addChild (loader); // config camera view3d.camera.lookAt (loader.position); 

Deze functie heeft drie secties:

  1. Eerst maken we alles vrij, voor het geval dat ons programma eerder is uitgevoerd.
  2. Daarna initialiseren we een nieuw Loader3D bijvoorbeeld en luisteraars eraan toevoegen die worden geactiveerd wanneer een fout wordt gegenereerd wanneer een 3D-bestand volledig is geladen. Om het zichtbaar te maken, voegen we het toe aan de View3Dzijn scène.
  3. Om ervoor te zorgen dat we het object daadwerkelijk kunnen zien zodra het is geladen, vertellen we de camera ernaar te kijken.

Stap 7: behandel alle evenementen

Vervolgens voegen we alle gebeurtenishandlerfuncties toe, die allemaal iets te maken hebben met het laden van het 3DS-bestand.

 privéfunctie onClick_mcBrowse (e: MouseEvent): void file.browse ([new 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!";  private function onIOError (e: IOErrorEvent): void labelDebug.text + = ".File not found Error!";  private function onFileSelected (e: Event): void labelDebug.text = "Bestand:" + file.name; file.removeEventListener (Event.SELECT, onFileSelected); file.addEventListener (Event.COMPLETE, onFileLoaded); file.load ();  private function onFileLoaded (e: Event): void file.removeEventListener (Event.COMPLETE, onFileLoaded); initLoader (); loader.loadData (e.target.data);  private function onError_loader (e: LoaderEvent): void trace ("Fout bij laden van bestand ..."); labelDebug.text + = ".Laadfout";  private function onComplete_loader (e: LoaderEvent): void trace ("3D File loaded"); 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); 

Wanneer de gebruiker op de knop Bladeren klikt, wordt het dialoogvenster Bladeren door bestanden weergegeven FileFilter om de weergegeven bestanden te beperken tot die met een .3ds uitbreiding. We voegen verschillende gebeurtenislisteners toe aan dit dialoogvenster, zodat we kunnen detecteren wanneer een bestand wordt gedetecteerd of een fout optreedt.

Nadat een bestand is geselecteerd, laden we het in de FileReference instantie die we eerder hebben geïnitialiseerd. Als het eenmaal is loaded, we noemen het initLoader () functie die we in de vorige stap hebben gedefinieerd, waardoor ons 3D-model wordt geladen.

Op dit moment zijn er twee mogelijke staten die we kunnen vangen:

  • Een daarvan is de "error" -status, wat betekent dat ons programma het 3D-modelbestand niet kan laden (misschien is het pad niet correct of is het kaarttextuurbestand verkeerd ...).
  • De andere is de "geladen met succes" -gebeurtenis, waarop we het geladen bestand naar a casten maas en voeg het toe aan de scène van View3D.

Om ons geheugen vrij te maken en later opnieuw te gebruiken, moeten we over onze lader beschikken.

Aan het einde van bovenstaande code (ervan uitgaande dat het bestand is geladen) voegen we een toe ENTER_FRAME evenement, die we zullen gebruiken om het object te renderen. We zullen die handler nu schrijven.


Stap 8: Start de Render Loop

Nu alles is geïnitialiseerd, zijn we klaar om alles weer te geven. Bij elk frame laten we het 3D-object ronddraaien (draaien) en bellen met het render () functie van View3D om het scherm bij te werken.

 private function onEnterFrame (e: Event): void object3d.yaw (1); // yaw door een eenheid view3d.render (); 

Stap 9: Compileren en uitvoeren!

Bijna klaar! Stel uw SWF samen met F5 en zie uw eindresultaat. Zo interessant, toch?

U kunt doen dan alleen het object draaien - proberen te bellen object3d.moveFoward (10) of object3d.pitch (1). U kunt dit zelfs doen als reactie op een muisbeweging of een toetsdruk.

Alleen ter referentie en om ervoor te zorgen dat u de juiste bestandsnamen en locaties voor alles hebt gebruikt, hier is wat uw FlashDevelop-project eruit zou moeten zien:


Conclusie

We hebben de eerste standaard 3D-zelfstudie afgerond over de nieuwste 3D Accelarate-functie van Adobe. Ik heet alle lezers van harte welkom om contact met mij op te nemen via de opmerkingen of via mijn website, op elk gewenst moment. Bedankt voor het lezen. Tot de volgende keer. Veel succes en veel plezier!