Reisen til den neste dimensjonen Med Papervision3D: Part 1

Journey til neste dimensjon med Papervision3D: Del 1
Del
Del
Del
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I tråd med vår Papervision3D Essentials giveaway, dagens tutorial har også en PV3D tema.

Denne todelte veiledningen vil vise deg hvordan du kommer i gang med Papervision3D motor, deretter hvordan du gjør din skapelse hoppe ut av skjermen ved hjelp av en anaglyph effekt i kombinasjon med 3D-briller.



Innledning

Fikk et par 3D-briller liggende rundt? Her i Storbritannia, er Channel 4 kjører en spesiell 3D uke - sju dager av TV-programmer som sendes i 3D - så masse folk her gjør. La oss ta dem i bruk.

Denne todelte veiledningen vil vise deg hvordan du kommer i gang med Papervision3D motor, og deretter hvordan du gjør din skapelse hoppe ut av skjermen.

I denne første delen vil du lære det grunnleggende PV3D, og ​​endte opp med noe som dette:

... og i den andre delen, vil du lære om anaglyph effekt for 3D-briller, og bruke den til hva du har gjort som så:

Trinn 1: Oppsett

Hvis du bruker Flash, opprette en ny Actionscript 3.0 Flash-fil. Angi størrelsen på scenen for å bli hva du vil -. Jeg vil holde med standard 550 av 400 piksler

Mens du er i gang, lage en ny Actionscript-fil, og lagre den som Main.as
i samme mappe som FLA. Vi kommer til å bruke dette som filen som FLA er dokument klasse
, så klikker du på en blank plass i FLA-filen, og skriv inn Hoved
i "Dokument klassen" boksen av eiendommene . panelet

(Hvis du ikke bruker Flash IDE, bare lage en ny AS3 prosjekt.)

Trinn 2: Last ned Papervision3D

Leder over til Papervision Last ned Side. Det er mange forskjellige versjoner og noen forskjellige typer filer (zip, SWC, MXP). Bare ta den nyeste .zip filen (det bør si Utvalgt
ved siden av). Den jeg bruker heter Papervision3D 2.1.920.zip (for bruk med "Papervision3D Essentials" bok)

Trinn 3:. Pakk ut zip

Extract zip-filen du nettopp lastet ned til hvor som helst på harddisken. Jeg liker å holde alle de forskjellige motorer jeg bruker i samme mappe, men det er opp til deg

Trinn 4:. Sett en CLASSPATH

Flash behov for å vite hvor du pakket Papervision før det kan bruk det. Vi bruker en classpathen
for dette: Klikk på Rediger > Preferanser
, velger du Action
klikk på Actionscript 3.0 Innstillinger ...
.

I boksen som vises, klikker du den lille "trådkors" -ikonet, og deretter finner mappen hvor du pakket Papervision og klikk på OK. Klikk OK til de andre boksene til du kommer tilbake til FLA.

Hvis du ikke bruker Flash IDE, må du sette dette på en annen måte. For eksempel, i FlashDevelop, bør du klikke Verktøy > Global Classpaths

Trinn 5:. Still Scene i Papervision

I Papervision, må alle 3D-objekter plasseres inne i en scene
. Det er typen som scenen i vanlig Actionscript. Så, før vi gjør noe vi trenger for å lage en Scene3D
objekt som skal inneholde alt annet.

Bytt til Main.as fil. La oss raskt legge basen koden som trengs for ethvert dokument Klasse:
pakke {import flash.display.MovieClip; public class Hoved strekker MovieClip {offentlig funksjon main () {}}}

Scene3D objektet er i org.papervision3d.scenes.Scene3D
, så vi trenger å import
det, deretter opprette en ny offentlig Var
å holde scenen, og til slutt lage selve scenen objekt: (linje 4, 8 og 12)
pakke {import flash.display.MovieClip; import org.papervision3d.scenes.Scene3D; public class Hoved strekker MovieClip {public Var scene: Scene3D; offentlig funksjon main () {scene = new Scene3D (); }}}
Trinn 6: Legg en Cube

Til å begynne med, la oss bare lage en stor vanlig kube sitter i vår scene

Vi vil følge den samme slags trinn som. ovenfor for å lage den, og deretter legge den til vår scene: (linje 5, 10, 15, 16)
pakke {import flash.display.MovieClip; import org.papervision3d.scenes.Scene3D; import org.papervision3d.objects.primitives.Cube; public class Hoved strekker MovieClip {public Var scene: Scene3D; offentlig Var kube: Cube; offentlig funksjon main () {scene = new Scene3D (); cube = new Cube (); scene.addChild (kube); }}}

Merk at vi bruker "addChild ()" for å legge kuben til scenen, akkurat som vi gjør når du legger til en MovieClip til Stage

Trinn 7:. Color Cube

Koden over vil gi deg en feilmelding hvis du prøver å kjøre den. Det er fordi vi ikke har fortalt kuben hva dets overflater bør se ut.

Papervision bruksområder materialer
å beskrive hvordan en overflate ser ut. Vi kan gjøre en veldig enkel, single-farget materiale ved hjelp av en ColorMaterial Bilde:
Var grayMaterial: ColorMaterial = new ColorMaterial (0xCCCCCC);

"0xCCCCCC" representerer fargen grå; bare ta fargekoden av alle farger og erstatte #
med 0x Bilde:

Fordi en kube har seks ansikter, må vi gi den seks materialer. For å gjøre dette setter vi alle seks i en liste:
Var materialsList: MaterialsList = new MaterialsList (); materialsList.addMaterial (grayMaterial, "front"); materialsList.addMaterial (grayMaterial, "tilbake"); materialsList.addMaterial ( grayMaterial, "venstre"); materialsList.addMaterial (grayMaterial, "rett"); materialsList.addMaterial (grayMaterial, "topp"); materialsList.addMaterial (grayMaterial, "bottom");

... og deretter vedta at listen til kuben når vi lager det:
kube = new Cube (materialsList);

Så, bør hele koden ende opp som ser slik ut: (ikke glem de import
uttalelser! )
pakke {import flash.display.MovieClip; import org.papervision3d.scenes.Scene3D; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.utils.MaterialsList; public class Hoved strekker MovieClip {public Var scene: Scene3D; offentlig Var kube: Cube; offentlig funksjon main () {var grayMaterial: ColorMaterial = new ColorMaterial (0xCCCCCC); Var materialsList: MaterialsList = new MaterialsList (); materialsList.addMaterial (grayMaterial, "front"); materialsList.addMaterial (grayMaterial, "tilbake"); materialsList.addMaterial (grayMaterial, "venstre"); materialsList.addMaterial (grayMaterial, "riktig"); materialsList.addMaterial (grayMaterial, "topp"); materialsList.addMaterial (grayMaterial, "bottom"); scene = new Scene3D (); cube = new Cube (materialsList); scene.addChild (kube); }}}
Trinn 8: Legge til et kamera

Så har vi noen feil, men for å se noe, må vi legge til en kamera
til scenen. Vi får se alt gjennom kameraets "lens"

Legge til et kamera er like enkelt som å legge en kube - enklere, faktisk, som vi ikke trenger å addChild () det til scenen.:
import org.papervision3d.cameras.Camera3D; offentlig Var kamera: Camera3D; scene = new Scene3D (); kube = new Cube (materialsList); scene.addChild (kube), kamera = new Camera3D (); //dette er den nye linjen i Main ()

Nå et kamera er på scenen, men det er ikke koblet til noe svar, så vi kan fortsatt ikke se kuben

Trinn 9: Legg en View og en Renderer

Som standard er kuben plasseres rett smellkyss i midten av scenen (ved x = 0, y = 0, z = 0), og kameraet er plassert 1000 enheter tilbake fra det (ved x = 0, y = 0, z = -1000).

Hvordan kan vi få det bildet som kameraet ser inn i Flash Player-vinduet?

Svaret er at vi bruke en view
. Dette er en type Displayobject, som en MovieClip, slik at vi kan addChild () det til scenen. Men vi kan også gjøre Papervision gjengi plakater (dvs. trekke) kameraets syn på denne view - det er litt som å ha en artist tegne hva han kan se gjennom en kameralinse, så tar hans tegning og stikker den til en TV-apparatet. Unntatt raskere

Så vi trenger for å lage en view og en renderer:
import org.papervision3d.view.Viewport3D, import org.papervision3d.render.BasicRenderEngine; offentlig Var view. Viewport3D; offentlig Var renderer : BasicRenderEngine; //sette dette på slutten av main () view = new Viewport3D (); viewport.autoScaleToStage = true; //dette vil gjøre synsfeltet like stor som stageaddChild (view); renderer = new BasicRenderEngine ();
Trinn 10: Render Scene

Nå er alt vi trenger å gjøre er å gjøre det renderer gjøre faktiske rendering. For dette, må den vite scenen, kameraet, og synsfeltet:
renderer.renderScene (scene, kamera, view);

Endelig! Vi kan endelig teste ut SWF. Trommevirvel, please ...

Utrolig! Forbløffende! OK fint, det er faktisk ganske halt. Hvordan kan vi også fortelle det er en kube? Det ser ut som en firkant

Trinn 11:.. Roter Cube

Hvis vi rotere kuben, vil vi være i stand til å fortelle om det er faktisk en kube eller ikke

Siden kuben er i tre dimensjoner, ordet "roter" er litt forvirrende - hvilken retning mener vi? Vi trenger å spesifisere om vi roterer rundt x-aksen, y-aksen, eller z-aksen.

Cube
objekt har tre egenskaper vi kan bruke til å definere dette, kalles (overraskende) rotationX
, rotationY Hotell og rotationZ
. La oss endre et par av dem:
scene = new Scene3D (); kube = new Cube (materialsList); cube.rotationX = 25; //endre rotationcube.rotationY = 40; //endre rotationscene.addChild (kube), kamera = new Camera3D ();

Det er bedre, men siden alle ansikter er nøyaktig samme farge, de bare flette inn i hverandre. La oss fikse det

Trinn 12:. Reskin Cube

I stedet for grå, jeg kommer til å male sidene med ActiveTuts + logo

Hvis du bruker. Flash IDE, opprette et nytt filmklipp og tegne eller lime inn bildet du ønsker å bruke. Jeg har tatt med logoen i min FLA biblioteket inne i zip.

Høyreklikk på filmklipp og velg Egenskaper. Sjekk "eksport for Action" og gi den en klasse navn. Dette vil gi deg tilgang til den ved hjelp av kode. (Hvis du ikke bruker Flash IDE, inneholder zip også en SWC med en MovieClip kalt ActiveTutsLogo som du kan bruke. Eller du kan opprette en ny MovieClip i kode og legge bildet til det. Jeg har ikke tenkt å gå inn i detaljer om det her, men.)

I stedet for en ColorMaterial
vi kommer til å bruke en MovieMaterial
, og i stedet for å angi en farge, vi vil angi et filmklipp. Så erstatte dette:
Var grayMaterial: ColorMaterial = new ColorMaterial (0xCCCCCC); Var materialsList: MaterialsList = new MaterialsList (); materialsList.addMaterial (grayMaterial, "front"); materialsList.addMaterial (grayMaterial, "tilbake"); materialsList.addMaterial (grayMaterial, "venstre"); materialsList.addMaterial (grayMaterial, "rett"); materialsList.addMaterial (grayMaterial, "topp"); materialsList.addMaterial (grayMaterial, "bottom");

... med dette:
Var logoMaterial: MovieMaterial = new MovieMaterial (ny ActiveTutsLogo ()); //erstatte "ActiveTutsLogo" ovenfor med Class navnet på filmen clipvar materialsList: MaterialsList = new MaterialsList (); materialsList.addMaterial (logoMaterial, "front"); materialsList.addMaterial (logoMaterial, "tilbake"); materialsList.addMaterial (logoMaterial, "venstre"); materialsList.addMaterial (logoMaterial, "rett"); materialsList.addMaterial (logoMaterial, "topp"); materialsList .addMaterial (logoMaterial, "bottom");

Du må også importere MovieMaterial:
importere org.papervision3d.materials.MovieMaterial;

Test det igjen:

Vel, det fungerer, men det ser litt bulkete

Step 13 (ekstrautstyr). Fjern de Dents

"bulkete" utseende er fordi Papervision er satt som standard for å trekke ting raskt i stedet for nøyaktig . Jeg vil være sikker på denne opplæringen vil kjøre på tregere datamaskiner, så jeg kommer til å la det bli med det, men her er hvordan du kan forbedre det:

Når du oppretter kuben, kan du gi det parametere til definere hvor mange segmenter
hvert ansikt er delt opp i til. Jo flere segmenter du velger, ser mer nøyaktig kuben - men jo saktere det blir gjengitt

Jeg har funnet ut at 10 er et godt antall segmenter som skal brukes i hver retning.. Slik kode for som ser:
cube = new Cube (materialsList, 500, 500, 500, 10, 10, 10);

Den femte, sjette og syvende parametere definerer antall segmenter som brukes i hver retning. For å sette dem, men vi må spesifisere alle parametrene før
femte samt

Vi er allerede spesifisere første parameter -. Det er materialliste. Den andre, tredje og fjerde parametere definerer bredde, dybde og høyde av kuben. Disse er satt til 500 som standard, så jeg har holdt dem det samme her

Hvis du bruker ovenfor linje med kode, vil kuben se slik ut:.!

Mye penere

Trinn 14: Gjør Cube Spin

Vi kan gjøre en vanlig MovieClip snurre rundt ved å øke sin rotasjon
eiendom hver ramme - og selvfølgelig, vi kan gjøre det samme med kuben og dens rotationX /Y /Z-verdiene

Opprett en ENTER_FRAME hendelse lytteren, som vil kjøre hver ramme.
import flash.events.Event; //nederst i main () addEventListener ( Event.ENTER_FRAME, onEnterFrame); //som en ny funksjon //inne i hovedklassen, men utenfor main () functionpublic funksjon onEnterFrame (evt: Hendelses): void {cube.rotationX = cube.rotationX + 5; cube.rotationY = cube.rotationY + 5;}

Dette vil gjøre kuben slå litt mer hver ramme. Så hvis du teste SWF ut nå ... kuben vil holde seg helt i ro. Huh

Trinn 15: Re-gjengi Scene Hver Frame

Tenk tilbake til maleren. Vi er fortsatt ute på sin gamle bildet - vi trenger ham til å trekke oss en ny hver ramme, eller vi vil ikke se noen endringer

Så, modifisere onEnterFrame () -funksjonen:
publikum! funksjon onEnterFrame (evt: Hendelses): void {cube.rotationX = cube.rotationX + 5; cube.rotationY = cube.rotationY + 5; renderer.renderScene (scene, kamera, view);}

Sjekk det ut nå:

Trinn 16: Legg Flere Cubes

En kube er flott, men som Roman allerede viste deg hvordan du gjøre det med Away3D, la oss ta ting litt videre.

La oss legge til noen flere, for å danne en horisontal linje av kuber. Vi kan bruke en enkel for
løkke til å gjøre det; bare erstatte denne koden:
cube = new Cube (materialsList); cube.rotationX = 25; //endre rotationcube.rotationY = 40; //endre rotationscene.addChild (kube);

... med dette:
for (var i: int = 1; i < = 1; i ++) {kube = new Cube (materialsList); cube.x = i * 350; cube.rotationX = 25; cube.rotationY = 40; scene.addChild (kube);}

Merk at jeg gjør x-posisjonen til hver kube avhenge av hvor langt vi er gjennom løkken. Hvis du kjører denne, vil du få følgende:

Trinn 17: krympe Cubes

Whoops, kuber er for nær hverandre. Vi kan krympe dem å komme rundt dette; bare endre skalere
tilhører hver kube:
for (var i: int = 1; i < = 1; i ++) {kube = new Cube (materialsList); cube.x = i * 350; cube.scale = 0,40; //gjør kuber 40% av opprinnelig størrelse cube.rotationX = 25; cube.rotationY = 40; scene.addChild (kube);}
Trinn 18: Tilsett Cubes til en Array

Så det løser krysset problem, men bare en av våre kuber er spinning. Hvordan kommer

Det er fordi kube
variabel alltid refererer bare til siste Anmeldelser kube skapt - og vår onEnterFrame () -funksjonen bare endrer rotasjoner av at en kube.

Så for å fikse dette, trenger vi en Array. Akkurat som vår liste materialer lagret flere materialer, vil vår Array lagre flere kuber
offentlig Var cubeArray: Array; cubeArray = new Array ();. //opprette den nye Arrayfor (var i: int = 1; i < = 1; i ++) {kube = new Cube (materialsList); cube.x = i * 350; cube.scale = 0,40; cube.rotationX = 25; cube.rotationY = 40; scene.addChild (kube); cubeArray.push (kube); //legger den nye kuben til array}

("Push" betyr bare "legge til slutten av listen".)

Trinn 19: Gjør alle Cubes Spin

Nå som hver kube er i Array, vi kan sløyfe gjennom Array hver ramme og rotere hver av dem:
offentlig funksjon onEnterFrame (evt: Hendelses): void {for hver (kube i cubeArray) {cube.rotationX = kube .rotationX + 5; cube.rotationY = cube.rotationY + 5; } Renderer.renderScene (scene, kamera, view);}

"for hver" løkke gjør kube
variabel refererer til hver kube i sving, en om gangen, i stedet for bare til det siste kube opprettet som det gjorde før. Her er resultatet:

Suksess

Trinn 20: Lag en Square of Cubes

Vi har laget en linje av kuber, så en firkant ikke kommer til å være vanskelig. I stedet for bare å lage tre kuber, vil vi lage tre linjer
av tre kuber

For å gjøre dette, kan vi bruke en løkke-i-løkke, slik:.
for (var i: int = 1; i < = 1; i ++) {for (var j: int = 1; j < = 1; j ++) //sløyfe inne i en løkke {kube = new Cube ( materialsList); cube.x = i * 350; cube.y = j * 350; //ikke glem å endre j! cube.scale = 0,40; cube.rotationX = 25; cube.rotationY = 40; scene.addChild (kube); cubeArray.push (kube); } //Ikke glem dette avsluttende brakett enten}

Test det ut:

Nice. Og merk at vi ikke trengte å endre koden inne onEnterFrame () i det hele tatt; loop som går hver ramme bare roterer hver kube inne i Array - og vi er fortsatt presser hver eneste kube på Array

Trinn 21:. Lag en kube av Cubes

Vel, det 'd være skuffende å stoppe på en firkant, ville det ikke? Tross alt, dette er en 3D tutorial.

Jeg forventer at du kan finne ut hvordan du gjør dette trinnet på egen hånd. Men i tilfelle du ønsker å sammenligne:
for (var i: int = 1; i < = 1; i ++) {for (var j: int = 1; j < = 1; j ++) {for (var k: int = 0; k < = 2; k ++) {kube = new Cube (materialsList); cube.x = i * 350; cube.y = j * 350; cube.z = k * 350; cube.scale = 0,40; cube.rotationX = 25; cube.rotationY = 40; scene.addChild (kube); cubeArray.push (kube); }}}

Jeg har vært litt sleipe her. Jeg har begynt å k på 0 i stedet for på -1, fordi ellers frontrste laget av kuber ville være for nært kameraet. Selvfølgelig kan du bruke hvilken som helst tall du vil.

Hei, la du merke til at den "bulkete" effekten har i utgangspunktet forsvunnet nå som vi bruker mindre kuber?

Awesome
Flere ideer til å prøve

Dette er bare toppen av isfjellet av hva du kan gjøre med Papervision3D. Før vi går videre til 3D-briller, her er et par ting du kan eksperimentere med:

Flytte kubene, i stedet for å rotere dem, du kan bare endre x, y og z-egenskapene til hver kube.

Bytte kuber med kuler: hvis du importerer org.papervision3d.objects.primitives.Sphere
du kan bruke Sphere klassen. Sjekk ut docs på dette her

Kontrollere kamera med musen. Du kan få musens x- og y-posisjon til enhver tid med mouseX Hotell og mousey
egenskaper. Du kan bevege kameraet ved å endre sin x, y og z-egenskaper. Hvorfor ikke koble de to sammen?

å bli videreført ...

I den andre delen, vil du lære hvordan du gjør din scene arbeid med 3D-briller. Så hvis du har et par, ikke kaste dem bort!

I mellomtiden, takk for at du leser den første delen. Jeg håper du fant det nyttig. Hvis du har spørsmål, eller om noe var forvirrende, kan du legge inn en kommentar nedenfor. Anmeldelser