Arbetar på Pixel Level med BitmapData och Away3D

Välkommen till denna introduktion för att arbeta på pixelnivå med ActionScript 3 BitmapData-objekt. Vi tar några 2D-bilder, bryter dem in i sina pixelpunkter och monterar dem sedan som 3D-bilder som vi kan flytta och rotera.


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:


Steg 1: Konfigurera

Strax innan vi hoppar in, låt oss ta en stund att titta på hur provprojektet läggs ut. När du öppnar källlåset för den här handledningen kommer du att få källor till varje viktigt steg, du kan gå direkt och göra en kopia av Börja mapp eftersom detta kommer att fungera som vår utgångspunkt.

Inne i den här mappen hittar du två andra mappar; src och bin. De src mappen är där vi sparar alla våra kod och FLA-filer och bin mappen är där Flash kommer att spara SWF-filerna. Inuti src mapp där finns Main.FLA och den Main.AS dokument klass.

Om du av någon anledning hittar ett fel i din kod, försök att åtgärda det (alltid bra att lära dig av misstag) men om du inte kan oroa dig inte! Du kan hoppa direkt in och använda en av stegmapparna i källlås som ligger närmast det steg du var på.


Steg 2: Hämta Away3D

Om du redan har tittat på Main.as filen kommer du redan märka några referenser till Away3D, en 3D-ram för Flash. Vi måste ladda ner det här och lägga till det i vårt projekt för att fortsätta.

Du kan fånga sin senaste version från Away3D-webbplatsen.

När denna nedladdning har slutförts, öppna zip-filen och inuti away3d_3_6_0 \ src mapp hittar du tre mappar, Away3D, nochump och wumedia. Kopiera dessa, som visas nedan till din src mapp.


Steg 3: Flashfilen

Om du inte redan har öppnat Main.fla och Main.as. Om du tittar i Flash-biblioteket kan du se en bild som heter 1.png och a Filmklipp med ett förekomstnamn på img1, som kommer att fungera som en grundläggande behållare för png.

Vi ska utföra en snabb sammanställning bara för att se till att vi har lagt till Away3D korrekt. Om allt går bra borde vi se en tom Flash-film med en mörkgrå bakgrund och inga felmeddelanden från Flash.


Steg 4: Main.as-filen

Granskar Main.as fil vi kan se några variabler som används i Away3D, det finns redan en mängd tutorials på Away3D men vi kommer snabbt att läsa om dessa:

 // grundläggande Away3D egenskaper skyddade var scen: Scene3D; skyddad var kamera: TargetCamera3D; skyddad varvy: View3D;
  • Scene3D är ett utrymme vi kan använda för att lägga till 3D-objekt som kuber och sfärer.
  • TargetCamera3D är en av de många typerna av kameror som finns i Away3D, det är det vi använder för att titta på Scene3D.
  • View3D är en utsiktsport, ofta beskrivet som "fönstret" där vi ser vår scen.

Utan att gå in på specifika kan du också se en grundläggande scen är inställd redo för användning med initAway3d () metod. Observera att den lägger till en ENTER_FRAME EventListener, detta berättar bara Away3D till göra() (eller teckna) några objekt som läggs till i Scene3D varje ram.

 / ** * Away3D grundscen setup * / privat funktion initAway3d (): void scene = new Scene3D (); kamera = ny TargetCamera3D (z: -200); view = new View3D (scen: scen, kamera: kamera); addChild (vy); addEventListener (Event.ENTER_FRAME, renderLoop);  / ** * render loop * / privat funktion renderLoop (händelse: Event): void view.render (); 

Det är ganska mycket det för introduktionen till Main.as klass, vi kommer att bygga allt annat när vi går.


Steg 5: Bitmappar och BitmapData

Vi ska hoppa rakt in och introducera dessa två klasser, eftersom vi kommer att arbeta med dessa under hela handledningen. Om du är ny till Bitmap och BitmapData du kan tänka på dem som målare och en samling färgmålningar. De är helt olika objekt, men båda är anslutna, BitmapData innehåller all pixelinformation eller penselsträngar och skulle inte vara något utan att målas på en duk eller i det här fallet Bitmap!

Låt oss testa detta genom att lägga till en instans av img1 MovieClip till skede och göra en kopia av det med Bitmapp / BitmapData.

Ändra Main.as till följande:

 / ** * konstruktör * / allmän funktion Main () initAway3d (); drawExample ();  / ** * ett snabbt exempel på BitmapData och Bitmap-användning * / privat funktion drawExample (): void // skapa en instans av img1-objektet på scenen för att kopiera var img: MovieClip = new img1 (); addChild (img); // skapa ett BitmapData-objekt med följande parametrar: bredd, höjd, transparent, färg var bmpData: BitmapData = ny BitmapData (img.width, img.height, true, 0x000000); // ritar en kopia av img MovieClip till BitmapData bmpData.draw (img); // lägger till en bitmapp till scenen med BitmapData (kopia av img1) informationen för att visa var bmp: Bitmap = ny Bitmap (bmpData); bmp.y = img.height; addChild (BMP); 

Titta på drawExample () kod, de första två raderna lägger helt enkelt till img1 protestera mot skede, det här är bilden vi ska göra av kopia av.

Därefter skapar vi en BitmapData objekt med följande parametrar:

  • bredd, bredden för att göra BitmapData
  • höjd, höjden för att göra BitmapData
  • transparent, huruvida BitmapData bör innehålla transparenta pixlar
  • Färg, bakgrundsfärgen

Som vi vet bredden och höjden från img1 Vi har satt dem direkt, eftersom vi behöver transparens ställer vi nästa parameter till sant och slutligen anger vi 0x000000 eller svart som bakgrundsfärg eftersom det blir öppet tills vi fyller det.


Steg 6: Bitmaps och BitmapData fortsätter

Fortsätt på, nu har vi BitmapData objektuppsättning vi har flera alternativ tillgängliga för oss, vi kan till exempel slinga genom pixel efter pixel och kopiera bilden (vi använder något så här senare i handledningen), eller vi kan använda dra() metod.

De dra() metoden tar a Filmklipp eller Sprite som en parameter och kommer att kopiera all pixelinformation från objektet till BitmapData.

 / ** * ett snabbt exempel på BitmapData och Bitmap-användning * / privat funktion drawExample (): void // skapa en förekomst av img1-objektet på scenen för att kopiera var img: MovieClip = new img1 (); addChild (img); // skapa ett BitmapData-objekt med följande parametrar: bredd, höjd, transparent, färg var bmpData: BitmapData = ny BitmapData (img.width, img.height, true, 0x000000); // ritar en kopia av img MovieClip till BitmapData bmpData.draw (img); // lägger till en bitmapp till scenen med BitmapData (kopia av img1) informationen för att visa var bmp: Bitmap = ny Bitmap (bmpData); bmp.y = img.height; addChild (BMP); 

Efter detta skapar de följande linjerna en Bitmap objekt med BitmapData pixelinformation som en parameter, som sedan flyttas under originalet img MovieClip och läggs till skede.

 / ** * ett snabbt exempel på BitmapData och Bitmap-användning * / privat funktion drawExample (): void // skapa en förekomst av img1-objektet på scenen för att kopiera var img: MovieClip = new img1 (); addChild (img); // skapa ett BitmapData-objekt med följande parametrar: bredd, höjd, transparent, färg var bmpData: BitmapData = ny BitmapData (img.width, img.height, true, 0x000000); // ritar en kopia av img MovieClip till BitmapData bmpData.draw (img); // lägger till en bitmapp till scenen med BitmapData (kopia av img1) informationen för att visa var bmp: Bitmap = ny Bitmap (bmpData); bmp.y = img.height; addChild (BMP); 

Det finns inte mycket setup som är inblandad i att konfigurera Bitmap aspekt som det bara visar en BitmapData, all den magiska är med BitmapData. Nu när vi testar borde vi få följande:


Steg 7: Läsning av pixelinformation

Nu har vi innehåll inne i BitmapData objekt saker börjar bli intressant eftersom vi kan börja manipulera bilder med getPixel32 () och setPixel32 ().

Börjar med getPixel32 () ändra drawExample () kod från ovan till följande:

 / ** * ett snabbt exempel på BitmapData och Bitmap-användning * / privat funktion drawExample (): void // skapa en förekomst av img1-objektet på scenen för att kopiera var img: MovieClip = new img1 (); addChild (img); // skapa ett BitmapData-objekt med följande parametrar: bredd, höjd, transparent, färg var bmpData: BitmapData = ny BitmapData (img.width, img.height, true, 0x000000); // ritar en kopia av img MovieClip till BitmapData bmpData.draw (img); // lägger till en bitmapp till scenen med BitmapData (kopia av img1) informationen för att visa var bmp: Bitmap = ny Bitmap (bmpData); bmp.y = img.height; addChild (BMP); // läs pixelinformation från BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); spår (pixelInformation, pixelInformation.toString (16)); 

Granskar koden vi har skapat en vanlig uint-variabel och tilldelade den till värdet på pixeln i bmpData vid 5 pixlar horisontellt och 0 pixlar vertikalt. Kom ihåg att värdena börjar vid 0 som så:

Att veta att vi valde att få pixelinformationen för 5,0, det skulle göra det svart pixel på översta raden och säkert nog Flash-utdata: 4278190080 ff000000

Det kanske inte verkar rätt först, men setPixel32 läser pixelns alfavärde (var som setPixel läser bara färgen). Vi brukar vanligtvis arbeta med hex-värden för färger som FFFFFF eller 000 tusen så vi kan berätta för Flash toString (16) för att få hex-värdet:


Steg 8: Ritningspixlar

Nu vet vi hur man läser pixelinformation, ritning pixlar till BitmapData är mycket lika, bara den här gången använder vi setPixel32 () att rita pixlar till BitmapData, och vi slänger också in en för slinga för att rita några pixlar.

Först ändra koden till följande:

 / ** * ett snabbt exempel på BitmapData och Bitmap-användning * / privat funktion drawExample (): void // skapa en förekomst av img1-objektet på scenen för att kopiera var img: MovieClip = new img1 (); addChild (img); // skapa ett BitmapData-objekt med följande parametrar: bredd, höjd, transparent, färg var bmpData: BitmapData = ny BitmapData (img.width, img.height, true, 0x000000); // ritar en kopia av img MovieClip till BitmapData bmpData.draw (img); // lägger till en bitmapp till scenen med BitmapData (kopia av img1) informationen för att visa var bmp: Bitmap = ny Bitmap (bmpData); bmp.y = img.height; addChild (BMP); // läs pixelinformation från BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); spår (pixelInformation, pixelInformation.toString (16)); // skriv pixelinformation till BitmapData var färg: uint = 0xffff0000; // ff0000 - full röd varrad: uint = 0; var-kolumn: uint = 0; för (rad; rad < bmpData.height; row++)  bmpData.setPixel32(column, row, color); column++; if(column > bmpData.width) kolumn = 0; 

Den nya koden börjar skapa en vanlig uint variabel heter Färg som vi lagrar 0xffff0000 som är: ff helt transparent, ff helt röd, 00 nej grön, 00 nej blå.

Sedan är det två räknare gjorda för rader och kolumner (rader är en linje med horisontella pixlar, kolumner är en linje med vertikala pixlar). Dessa räknare läggs sedan in på en för slinga som ökar raden och motvärdet varje gång, så när den blandas med setPixel32 () metod det kommer att dra en diagonal linje:


Steg 9: PixelObject3D-klassen

I det här steget ska vi presentera PixelObject3D.as klass. För att spara lite tid ta en kopia av klassen från Steg 8 mappen i källkoden och släpp den till din src mappen förutom Main.fla och Main.as.

När du har gjort det här kan vi snabbt titta på det innan vi börjar lägga till koden för att skapa 3D-objekt från pixlar.

 // egenskaper skyddade var _bitmapData: BitmapData = null; allmän var _scaleFactor: Number = 1; skyddad var _width: Number = 0; skyddad var _höjd: Nummer = 0;

Vi har några skyddade variabler högst upp i klassen, en för en BitmapData och tre Tal för bredden, höjden och en skala av objektet.

 / ** * konstruktör * / allmän funktion PixelObject3D ()  / ** * börjar skapandet * / public function createFromMovieClip (mc: MovieClip): void 

Följande är en tom klasskonstruktör och den metod vi ska arbeta med, createFromMovieClip (). Du kommer märka att den här metoden tar en parameter av Filmklipp typ, så som du redan kan gissa vi överför det a Filmklipp och det kommer att ge oss tillbaka en 3D-representation av den. När det är klart är det!


Steg 10: En instans av PixelObject3D-klassen

Medan PixelObject3D.as klassen gör inte någonting än, men vi lägger till en förekomst av det till Main.as klass så vi kan faktiskt se ändringarna på skärmen när vi går.

Börjar med att lägga till en privat variabel:

 // grundläggande Away3D egenskaper skyddade var scen: Scene3D; skyddad var kamera: TargetCamera3D; skyddad varvy: View3D; // Pixel3DObject protected var po3d: PixelObject3D;

Efter det lägger konstruktören ett samtal till createPixelObect3D ().

 / ** * konstruktör * / allmän funktion Main () initAway3d (); drawExample (); createPixelObect3D (); 

Slutligen lägg till följande funktion i Main.as fil. Detta kommer att skapa en instans av PixelObject3D klass, åberopa createFromMovieClip () metod och ge det en ny Filmklipp, de img1 vi har använt tidigare.

En sista rad att påpeka är att vi lägger till PixelObject3D klass som barn på scenen eftersom det är ett 3D-objekt, inte det Skede.

 / ** * skapar en PixelObject3D * / privat funktion createPixelObect3D (): void po3d = new PixelObject3D (); po3d.createFromMovieClip (ny img1 ()); scene.addChild (po3d); 

Steg 11: createFromMovieClip (mc: MovieClip)

Att veta att vi har passerat Filmklipp Vi vill återskapa från den här metoden. Det första på vår agenda är att göra en kopia av det med BitmapData exakt som vi gjorde tidigare. Vi kan sedan använda pixeldata för att börja skapa 3D-objekt.

Precis som tidigare ska vi skapa en BitmapData objekt och dra mc MovieClip objekt:

 / ** * börjar skapa processen * / public function createFromMovieClip (mc: MovieClip): void // butikshänvisningar och skapa bitmapdata _bitmapData = ny BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // Ange bredd / höjd _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); 

Vi ställer också in _bredd och _höjd variabler enligt mc bredd och höjd och multiplicera detta med _skalfaktor variabel, så kan vi skala upp eller ner storleken på 3D-pixlarna om vi vill. Mer om detta senare.


Steg 12: createFromMovieClip (mc: MovieClip)

Kom ihåg att BitmapData bara är pixelinformationen och utan att lägga till BitmapData i en bitmapp kan vi inte se den, men vi kan fortfarande läsa och skriva till den. Det här är perfekt för oss, eftersom vi ska använda detta steg för att börja loopa genom pixlarna i BitmapData och skilja de röda, gröna, blåa och alfa-värdena.

Ändra din createFromMovieClip () metod för att matcha detta:

 / ** * börjar skapa processen * / public function createFromMovieClip (mc: MovieClip): void // butikshänvisningar och skapa bitmapdata _bitmapData = ny BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // Ange bredd / höjd _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixelinformation var pixelValue: uint = 0; var röd: uint = 0; var grön: uint = 0; var blå: uint = 0; var alfa: uint = 0; // loop genom varje pixel horisontellt för (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 & 0xFF; röd = pixelValue >> 16 & 0xFF; grön = pixelValue >> 8 & 0xFF; blå = pixelValue & 0xFF; spår ("alfa:" + alfa + "rött:" + rött + "grönt:" + grönt + "blått:" + blått); 

Här har vi satt upp några variabler för färg- och alfa-värdena och startade sedan en för loop baserat på MC bredd.

Detta för slingan ställer in pixelValue variabel till värdet av den aktuella pixeln med hjälp av getPixel32 () metod som vi använde tidigare, men den här tidpunkten vi har använt 0 för den andra parametern som är y, så vi ska bara bearbeta den första horisontella pixellinjen.

Efter detta finns det några ganska komplexa matte som kallas bitmaskering och skiftning, för att spara lite tid du kan anta var och en av färgerna extraheras från pixelValue variabel och sedan utdata för oss att se använda spår(). Om du vill veta mer om bitvisa operatörer, bitskiftning och maskering kan du hitta ett bra inlägg på Polygonal Labs webbplats.

Det du bör se är resultatet av en hel massa 0 värden men uppmärksamma de två alfa: 255 linjer, dessa är de två svarta pixlarna på toppen av handen.


Steg 13: Skapa 3D-objekt från pixelvärdena

Phew det var ganska mycket logik i de sista stegen! Nu har vi grunderna igång, kan vi börja använda pixelinformationen som vi erhållit tidigare för att skapa ett 3D-mästerverk? nästan.

Om du har använt Away3D eller Papervision 3D innan du är bekant med det här steget, kommer vi att börja skapa 3D-kuber och tillämpa material på dem. För varje pixel som är alpha är 255 (ogenomskinlig) vi tar tag i sin färg och skapar ett material baserat på färgen som gäller för en 3D-kub, nedanför är koden för att sparka av det här:

 / ** * börjar skapa processen * / public function createFromMovieClip (mc: MovieClip): void // butikshänvisningar och skapa bitmapdata _bitmapData = ny BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // Ange bredd / höjd _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixelinformation var pixelValue: uint = 0; var röd: uint = 0; var grön: uint = 0; var blå: uint = 0; var alfa: uint = 0; // loop genom varje pixel horisontellt för (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 & 0xFF; röd = pixelValue >> 16 & 0xFF; grön = pixelValue >> 8 & 0xFF; blå = pixelValue & 0xFF; // om pixel är ogenomskinlig om (alpha == 255) // skapa en vanlig hex färgsträng, dvs FFFFFF eller 000000 var färg: String = red.toString (16) + green.toString (16) + blue.toString ); om (färg == "000") färg = "000000"; spår ("#" + färg); // skapa ett material från färgen och tillämpa på en 3D-kube var material: Material = nytt ColorMaterial (färg); var kub: Kub = ny kub (material: material, bredd: 2 * _scaleFactor, höjd: 2 * _scaleFactor, djup: 2 * _scaleFactor); // placera kuben från a-värde så att registrering / transformationspunkt alltid är centrerad cube.x = 0 - (_width / 2) + cube.width * i; this.addChild (kub); 

I ovanstående kod har vi använt röd, grön och blå variabler och skapade en vanlig hex färg, som du kan se produktionen från spår().

Sedan hex-färgen Färg variabel används för att skapa en ColorMaterial med Away3D, som bara är ett vanligt material baserat på en färg som kan appliceras på 3D-objekt.

Därefter skapar vi en Kub objekt och ange material att vara material objekt vi skapade linjen före den. Också värt att notera här är vi har satt bredd, höjd och djup (kom ihåg att vi arbetar i tre dimensioner nu!) till ett värde av två gånger värdet av _scaleValue variabel, så kan vi göra kuberna större eller mindre genom att ändra _scaleValue.

Slutligen positionerar vi Kub till noll minus hälften av bredden på mc multiplicerat med för loopbandräknare jag, Detta gör registreringen eller omvandlingspunkten för det färdiga 3D-objektet i mitten. Det läggs sedan till som ett barn och när du testar ser du två små svarta 3D-bilder Kub objekt.


Steg 14: Rader och kolumner

Nu är två 3D-kuber bra och alla men vi vill verkligen få hela handen att formas till 3D-kuber. Vi använder redan en för slinga till slingan genom alla pixlarna i den första raden, men hur får vi det att slingra igenom de återstående raderna av pixlar?

Du gissade det, en annan för slinga!

 / ** * börjar skapa processen * / public function createFromMovieClip (mc: MovieClip): void // butikshänvisningar och skapa bitmapdata _bitmapData = ny BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // Ange bredd / höjd _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixelinformation var pixelValue: uint = 0; var röd: uint = 0; var grön: uint = 0; var blå: uint = 0; var alfa: uint = 0; // loop genom varje rad av pixlar för (var j: int = 0; j < mc.height; j++)  // loop through each pixel horizontally for (var i:int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, j); alpha = pixelValue >> 24 & 0xFF; röd = pixelValue >> 16 & 0xFF; grön = pixelValue >> 8 & 0xFF; blå = pixelValue & 0xFF; // om pixel är ogenomskinlig om (alpha == 255) // skapa en vanlig hex färgsträng, dvs FFFFFF eller 000000 var färg: String = red.toString (16) + green.toString (16) + blue.toString ); om (färg == "000") färg = "000000"; spår ("#" + färg); // skapa ett material från färgen och tillämpa på en 3D-kube var material: Material = nytt ColorMaterial (färg); var kub: Kub = ny kub (material: material, bredd: 2 * _scaleFactor, höjd: 2 * _scaleFactor, djup: 2 * _scaleFactor); // placera kuben från a-värde så att registrering / transformationspunkt alltid är centrerad cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; this.addChild (kub); 

Den här gången har vi bara riktigt ändrat tre saker, en ny för loop som den här gången har j för sin räknare. De getPixel32 () har nu j variabel läggas till som y parameter och slutligen Kub placeras vertikalt med hjälp av j disken.

Detta fyller i stort sett huvudlogiken, nu går det igenom horisontellt, läser pixelvärdena, skapar a ColorMaterial och a Kub och placera dem i enlighet därmed. När den når slutet av den horisontella linjen, på grund av det nya för slinga kommer det att gå vidare till nästa pixel ner och slinga igenom horisontellt igen tills bilden är klar. Titta på dig själv genom att testa filmen:


Steg 15: In i den tredje dimensionen

Vi har nu alla dessa 3D-objekt men de ser väldigt 2D, så vi ska lägga till lite rörelse och få hela objektet att rotera.

För att göra detta måste vi spåra tillbaka till Main.as fil och lokalisera renderLoop () metod. Kom ihåg att Away3D måste göra (eller måla) 3D-bilden i varje ram, så vi kan lägga till några enkla rotationer till vår PixelObject3D att se allt barnet kuber rotera:

 / ** * render loop * / privat funktion renderLoop (händelse: Event): void pObject3D.rotationZ ++; view.render (); 

Gärna experimentera med rotationX, rotationY och rotationZ här kom bara ihåg att återställa den till koden ovan innan du fortsätter. Du kan också lägga till i create3DObject () att bättre centrera och anpassa kuber till kameran.

 / ** * skapar ett 3D-pixelobjekt från en MovieClip * / allmän funktion create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (ny img1 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Steg 16: Exploderar PixelObject3D

Nu är det mer som det, vi kan äntligen se 3D-pixelobjektet rotera. Vi kan börja tweak detta och lägga till en exploderad vy genom att helt enkelt redigera z värdet av kuber när vi skapar dem.

Hoppa tillbaka in i PixelObject3d.as klass och hitta linjerna där vi placerar Kub's x och y och lägg till följande:

 // om pixel är ogenomskinlig om (alpha == 255) // skapa en vanlig hex färgsträng, dvs FFFFFF eller 000000 var färg: String = red.toString (16) + green.toString (16) + blue.toString ); om (färg == "000") färg = "000000"; spår ("#" + färg); // skapa ett material från färgen och tillämpa på en 3D-kube var material: Material = nytt ColorMaterial (färg); var kub: Kub = ny kub (material: material, bredd: 2 * _scaleFactor, höjd: 2 * _scaleFactor, djup: 2 * _scaleFactor); // placera kuben från a-värde så att registrering / transformationspunkt alltid är centrerad cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; cube.z = -25 + (Math.random () * 50); this.addChild (kub); 

Detta kommer att flytta varje Kub till ett slumpmässigt djup från -25 till positivt 25 och skapa en bra exploderad effekt:


Steg 17: Skalning

Som den PixelObject3D är lite liten på skärmen, vi ska justera skalan något. Vi kan göra det snabbt genom att justera _scaleValue variabel i PixelObject3D.as klass och öka den till 1,5.

 / ** * skapar ett 3D-objekt från en MovieClip * * @ author Anton Mills * / allmän klass PixelObject3D utökar ObjectContainer3D // properties protected var _bitmapData: BitmapData = null; offentlig var _scaleFactor: Number = 1.5; skyddad var _width: Number = 0; skyddad var _höjd: Nummer = 0;

Steg 18: Olika bilder

Använda PixelObject3D klass för att skapa andra bilder är enkelt, enkelt importera bilden du vill bearbeta till Flash. Sedan konvertera den till en MovieClip som vanligt, ge den här gången en Klassnamn av img2 så här:

Nu kan du ändra Main.as att använda den nya img2 objekt med en liten ändring:

 / ** * skapar ett 3D-pixelobjekt från en MovieClip * / allmän funktion create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (ny img2 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Steg 19: Flera objekt

Du kan använda så många av dem som du vill, bara se till att du lägger till dem på Away3D-scenen och du kan ha flera. I det här exemplet har jag tagit bort z egendom som vi använde i steg 16 för explosionseffekten.

Main.as med en annan PixelObject3D Lagt till:

 / ** * En handledning som syftar till att införa ActionScript 3 BitmapData * och hur man använder BitmapData-informationen för att skapa en 3D * pixelform med Away3D. * * @author Anton Mills * / public class Main utökar MovieClip // grundläggande Away3D egenskaper skyddade var scen: Scene3D; skyddad var kamera: TargetCamera3D; skyddad varvy: View3D; skyddad var pObject3D: PixelObject3D; skyddad var pObject3D2: PixelObject3D;

Skapa sedan en annan instans:

 / ** * skapar ett 3D-pixelobjekt från en MovieClip * / allmän funktion create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (ny img2 ()); pObject3D.x = 40; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); pObject3D2 = ny PixelObject3D (); pObject3D2.createFromMovieClip (ny img1 ()); pObject3D2.x = 115; pObject3D2.y = -55; pObject3D2.rotationX = -5; scene.addChild (pObject3D2); 

Och slutligen rotera det i Away3D render loop:

 / ** * render loop * / privat funktion renderLoop (händelse: Event): void pObject3D.rotationY ++; pObject3D2.rotationY--; pObject3D2.rotationZ--; pObject3D2.rotationX ++; view.render (); 

Steg 20: Fin.

Allt som är kvar är att du ska testa din film och baska i underbarheten av 2D-pixlar förvandlade till 3D-objekt. Nu, vad kan du göra med BitmapData i din nästa applikation eller spel?


Slutsats

Genom denna handledning har vi tittat på en blandning av föremål men vi har främst fokuserat på BitmapData användning som teckning filmklipp in i BitmapData, använder sig av setPixel32 () att rita enskilda pixlar, visa BitmapData genom att använda en Bitmap och läser pixelvärden med getPixel32 ().

Vi har också täckt lite färgmatematik, få hex-färger och till och med individuella alfa, röda, gröna och blåa värden med toString (16). Slutligen skrev vi en liten slinga för att skapa 3D kuber med hjälp av pixelvärdena vi läser, phew!

Det finns så många möjligheter när du arbetar på pixelnivå och med lite fantasi och experiment kan du skapa några riktigt coola applikationer och spel! Tack för din tid, jag hoppas att du haft denna handledning.