Trabajando a nivel de píxeles con BitmapData y Away3D

Bienvenido a esta introducción para trabajar a nivel de píxeles con el objeto BitmapData de ActionScript 3. Tomaremos algunas imágenes en 2D, las dividiremos en sus píxeles componentes, luego las volveremos a ensamblar como imágenes en 3D que podemos mover y rotar..


Vista previa del resultado final

Echemos un vistazo al resultado final en el que trabajaremos:


Paso 1: Configuración

Justo antes de saltar, tomemos un momento para ver cómo se presenta el proyecto de muestra. Al abrir el código fuente para este tutorial, tendrá fuentes para cada paso significativo, puede seguir adelante y hacer una copia del archivo. empezar carpeta ya que esto servirá como nuestro punto de partida.

Dentro de esta carpeta encontrarás otras dos carpetas; src y compartimiento. los src carpeta es donde guardaremos todos nuestros códigos y archivos FLA y la compartimiento carpeta es donde Flash guardará los archivos SWF. Dentro de src carpeta hay la Main.FLA y el Principal.AS clase de documento.

Si por alguna razón encuentra un error en su código, intente solucionarlo (siempre es bueno aprender de los errores), pero si no puede, ¡no se preocupe! Puede volver a saltar y usar una de las carpetas de pasos en el archivo zip de origen más cercano al paso en el que estaba.


Paso 2: Descarga Away3D

Si ya has echado un vistazo a la Main.as Ya notará algunas referencias a Away3D, un marco 3D para Flash. Vamos a necesitar descargar esto y agregarlo a nuestro proyecto para continuar.

Puedes obtener su última versión desde el sitio de Away3D.

Una vez completada esta descarga, abra el archivo zip y dentro de la away3d_3_6_0 \ src carpeta encontrarás tres carpetas, away3d, nochump y Wumedia. Copie estos, como se muestra abajo a su src carpeta.


Paso 3: El archivo Flash

Si aún no lo has hecho, abre Main.fla y Main.as. Mirando en la Biblioteca Flash puede ver una imagen llamada 1.png y una Clip de película con un nombre de instancia de img1, que servirá como un contenedor básico para el png.

Vamos a realizar una compilación rápida solo para asegurarnos de haber agregado Away3D correctamente. Si todo va bien, deberíamos ver una película Flash en blanco con un fondo gris oscuro y sin mensajes de error de Flash.


Paso 4: El archivo Main.as

Examinando el Main.as En el archivo podemos ver algunas variables que se utilizan en Away3D, ya hay una gran cantidad de tutoriales en Away3D pero resumiremos rápidamente estos:

 // propiedades básicas de Away3D protegidas var scene: Scene3D; cámara var protegida: TargetCamera3D; Vista de var protegida: View3D;
  • Scene3D Es un espacio que podemos usar para agregar objetos 3D como cubos y esferas..
  • TargetCamera3D es uno de los muchos tipos de cámaras disponibles en Away3D, es lo que usamos para mirar a Scene3D.
  • View3D Es una ventana gráfica, a menudo descrita como la "ventana" en la que vemos nuestra escena..

Sin entrar en detalles, también puede ver que una escena básica está lista para su uso con el initAway3d () método. Note que agrega un ENTER_FRAME EventListener, esto simplemente le dice a Away3D que hacer() (o dibujar) cualquier objeto agregado al Scene3D cada cuadro.

 / ** * Configuración de escena básica de Away3D * / función privada initAway3d (): void scene = new Scene3D (); camera = new TargetCamera3D (z: -200); view = new View3D (scene: scene, camera: camera); addChild (ver); addEventListener (Event.ENTER_FRAME, renderLoop);  / ** * el bucle de procesamiento * / la función privada renderLoop (evento: Evento): void view.render (); 

Eso es todo para la introducción de la Main.as Clase, estaremos construyendo todo lo demás a medida que avanzamos..


Paso 5: Bitmaps y BitmapData

Vamos a entrar directamente e introducir estas dos clases, ya que trabajaremos con ellas a lo largo del tutorial. Si eres nuevo en Mapa de bits y BitmapData Usted puede pensar en ellos como un lienzo de pintores y una colección de hojas de pintura. Son objetos totalmente diferentes pero ambos están conectados, el BitmapData contiene toda la información de píxeles o pinceladas y no sería nada sin ser pintado en un lienzo o, en este caso, el Bitmap!

Probemos esto agregando una instancia de la img1 MovieClip al escenario y haciendo una copia de ella usando Bitmap / BitmapData.

Modifique el Main.as a lo siguiente:

 / ** * constructor * / public function Main () initAway3d (); drawExample ();  / ** * un ejemplo rápido de uso de BitmapData y Bitmap * / private function drawExample (): void // cree una instancia del objeto img1 en el escenario para copiar var img: MovieClip = new img1 (); addChild (img); // crear un objeto BitmapData con los siguientes parámetros: ancho, alto, transparente, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dibuja una copia del clip de película img en BitmapData bmpData.draw (img); // agrega un Bitmap al escenario con la información BitmapData (copia de img1) para mostrar var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

Mirando a la drawExample () Código, las dos primeras líneas simplemente agregan el img1 objetar al escenario, Esta es la imagen que haremos de copia de..

A continuación creamos un BitmapData Objeto con los siguientes parámetros:

  • anchura, el ancho para hacer el BitmapData
  • altura, la altura para hacer el BitmapData
  • transparente, si el BitmapData debe contener píxeles transparentes
  • color, el color de fondo

Como sabemos el ancho y la altura desde img1 los hemos establecido directamente, ya que vamos a necesitar transparencia, configuramos el siguiente parámetro como verdadero y, por último, especificamos 0x000000 o negro como color de fondo, ya que aparecerá transparente hasta que lo llenemos.


Paso 6: Bitmaps y BitmapData continuación

Continuando, ahora tenemos el BitmapData configuración de objetos tenemos varias opciones disponibles para nosotros, por ejemplo, podríamos recorrer cada píxel a píxel y copiar la imagen (usaremos algo como esto más adelante en el tutorial), o podríamos usar el dibujar() método.

los dibujar() método toma un Clip de película o Duende como parámetro y copiará toda la información de píxeles del objeto a la BitmapData.

 / ** * un ejemplo rápido del uso de BitmapData y Bitmap * / private function drawExample (): void // cree una instancia del objeto img1 en el escenario para copiar var img: MovieClip = new img1 (); addChild (img); // crear un objeto BitmapData con los siguientes parámetros: ancho, alto, transparente, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dibuja una copia del clip de película img en BitmapData bmpData.draw (img); // agrega un Bitmap al escenario con la información BitmapData (copia de img1) para mostrar var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

A continuación, las siguientes líneas crean una Mapa de bits objeto con el BitmapData La información de píxeles como parámetro, que luego se mueve debajo del original. img MovieClip y añadido a la escenario.

 / ** * un ejemplo rápido del uso de BitmapData y Bitmap * / private function drawExample (): void // cree una instancia del objeto img1 en el escenario para copiar var img: MovieClip = new img1 (); addChild (img); // crear un objeto BitmapData con los siguientes parámetros: ancho, alto, transparente, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dibuja una copia del clip de película img en BitmapData bmpData.draw (img); // agrega un Bitmap al escenario con la información BitmapData (copia de img1) para mostrar var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

No hay mucha configuración involucrada en la configuración del Mapa de bits aspecto simplemente muestra un BitmapData, toda la magia está con el BitmapData. Ahora, al probar, deberíamos obtener lo siguiente:


Paso 7: Leer información de píxeles

Ahora tenemos contenido dentro del BitmapData Las cosas de los objetos comienzan a ponerse interesantes, ya que podemos empezar a manipular imágenes usando getPixel32 () y setPixel32 ().

Empezando con getPixel32 () enmendar el drawExample () Código de arriba a lo siguiente:

 / ** * un ejemplo rápido del uso de BitmapData y Bitmap * / private function drawExample (): void // cree una instancia del objeto img1 en el escenario para copiar var img: MovieClip = new img1 (); addChild (img); // crear un objeto BitmapData con los siguientes parámetros: ancho, alto, transparente, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dibuja una copia del clip de película img en BitmapData bmpData.draw (img); // agrega un Bitmap al escenario con la información BitmapData (copia de img1) para mostrar var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); // lea la información de píxeles de BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); trace (pixelInformation, pixelInformation.toString (16)); 

Al examinar el código, hemos creado una variable uint regular y la hemos asignado al valor del píxel en el bmpData a 5 píxeles horizontalmente y 0 píxeles verticalmente. Recuerda que los valores comienzan en 0 como tal:

Sabiendo que elegimos obtener la información de píxel de 5,0, eso lo convertiría en un píxel negro en la fila superior y con una cantidad suficiente de Flash: 4278190080 ff000000

Eso podría no parecer correcto al principio, pero setPixel32 lee el valor alfa del píxel (donde como setPixel solo lee el color). Generalmente estamos acostumbrados a trabajar con valores hexadecimales para colores como FFFFFF o 000000 para que podamos decirle a Flash aString (16) para obtener el valor hexadecimal:


Paso 8: Dibujando pixeles

Ahora sabemos cómo leer la información de píxeles, dibujando píxeles a la BitmapData Es muy similar, solo que esta vez usamos. setPixel32 () para dibujar píxeles en BitmapData, y también lanzaremos una para bucle para dibujar algunos píxeles.

Primero modifique el código a lo siguiente:

 / ** * un ejemplo rápido del uso de BitmapData y Bitmap * / private function drawExample (): void // cree una instancia del objeto img1 en el escenario para copiar var img: MovieClip = new img1 (); addChild (img); // crear un objeto BitmapData con los siguientes parámetros: ancho, alto, transparente, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dibuja una copia del clip de película img en BitmapData bmpData.draw (img); // agrega un Bitmap al escenario con la información BitmapData (copia de img1) para mostrar var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); // lea la información de píxeles de BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); trace (pixelInformation, pixelInformation.toString (16)); // escriba la información de píxeles en el color var de BitmapData: uint = 0xffff0000; // ff0000 - full red var row: uint = 0; columna var: uint = 0; para (fila; fila < bmpData.height; row++)  bmpData.setPixel32(column, row, color); column++; if(column > bmpData.width) columna = 0; 

El nuevo código comienza creando un regular. uint variable nombrada color que almacenamos 0xffff0000 que es: ff totalmente transparente, ff completamente rojo, 00 no verde, 00 no azul.

Luego hay dos contadores hechos para filas y columnas (las filas son una línea de píxeles horizontales, las columnas son una línea de píxeles verticales). Estos contadores se colocan en un para bucle que aumenta el valor de la fila y el contador cada vez, por lo que cuando se mezcla con el setPixel32 () Método que dibujará una línea diagonal:


Paso 9: La clase PixelObject3D

En este paso vamos a introducir el PixelObject3D.as clase. Para ahorrar un poco de tiempo, tome una copia de la clase de la Paso 8 carpeta en la fuente zip y suéltela en su src carpeta además de la Main.fla y Main.as.

Una vez que haya hecho esto, echémosle un vistazo rápido antes de comenzar a agregar el código para crear objetos 3D a partir de píxeles.

 // propiedades protegidas var _bitmapData: BitmapData = null; public var _scaleFactor: Number = 1; var _width protegido: Número = 0; var _height protegido: Número = 0;

Tenemos algunas variables protegidas en la parte superior de la clase, una para una BitmapData y tres Números Para la anchura, altura y escala del objeto..

 / ** * constructor * / función pública PixelObject3D ()  / ** * comienza el proceso de creación * / función pública createFromMovieClip (mc: MovieClip): void 

Después de ellos hay un constructor de clase vacío y el método con el que trabajaremos., createFromMovieClip (). Notarás que este método toma un parámetro de Clip de película escribe, así que como ya puedes adivinar pasamos un Clip de película Y nos devolverá una representación 3D de ello. Cuando se termine eso es!


Paso 10: Una instancia de la clase PixelObject3D

Mientras que la PixelObject3D.as clase en realidad no hace nada todavía vamos a agregar una instancia de la misma a la Main.as clase, así que en realidad podemos ver los cambios en la pantalla a medida que avanzamos.

Comenzando con la adición de una variable privada:

 // propiedades básicas de Away3D protegidas var scene: Scene3D; cámara var protegida: TargetCamera3D; Vista de var protegida: View3D; // el Pixel3DObject protegido var po3d: PixelObject3D;

A continuación, agregue al constructor una llamada a createPixelObect3D ().

 / ** * constructor * / public function Main () initAway3d (); drawExample (); createPixelObect3D (); 

Por último añadir la siguiente función a la Main.as expediente. Esto creará una instancia de la PixelObject3D clase, invoca el createFromMovieClip () Método y pasarlo un nuevo Clip de película, la img1 hemos utilizado anteriormente.

Una última línea para señalar es que agregamos el PixelObject3D clase como hijo de la escena, ya que es un objeto 3D, no el Escenario.

 / ** * crea una función privada PixelObject3D * / createPixelObect3D (): void po3d = new PixelObject3D (); po3d.createFromMovieClip (new img1 ()); scene.addChild (po3d); 

Paso 11: createFromMovieClip (mc: MovieClip)

Sabiendo que hemos pasado el Clip de película Queremos recrear desde este método, lo primero en nuestra agenda es hacer una copia del mismo usando BitmapData exactamente como lo hicimos antes. Luego podemos usar los datos de píxeles para comenzar a crear objetos 3D..

Al igual que antes, vamos a crear un BitmapData objeto y dibujar el mc MovieClip objeto:

 / ** * comienza el proceso de creación * / public function createFromMovieClip (mc: MovieClip): void // almacena las referencias y crea el bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // establece width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); 

También establecemos el _anchura y _altura variables de acuerdo a la mc ancho y alto y multiplica esto por el _factor de escala variable, esto nos permite escalar hacia arriba o hacia abajo el tamaño de los píxeles 3D si lo deseamos. Más sobre esto más adelante.


Paso 12: createFromMovieClip (mc: MovieClip)

Recuerde que BitmapData es solo la información de píxeles y sin agregar BitmapData a un Bitmap no podremos verlo, pero podemos leerlo y escribirlo. Esto es perfecto para nosotros, ya que vamos a utilizar este paso para comenzar a recorrer los píxeles de BitmapData y separar los valores rojo, verde, azul y alfa..

Enmiende su createFromMovieClip () método para que coincida con esto:

 / ** * comienza el proceso de creación * / public function createFromMovieClip (mc: MovieClip): void // almacena las referencias y crea el bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // establece width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixel information var pixelValue: uint = 0; var rojo: uint = 0; var verde: uint = 0; var azul: uint = 0; var alfa: uint = 0; // recorre cada píxel horizontalmente para (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 y 0xFF; rojo = pixelValue >> 16 & 0xFF; verde = pixelValue >> 8 & 0xFF; azul = pixelValue & 0xFF; traza ("alfa:" + alfa + "rojo:" + rojo + "verde:" + verde + "azul:" + azul); 

Aquí hemos configurado algunas variables para el color y los valores alfa y luego comenzamos una para bucle basado en el mc's anchura.

Esta para bucle establece el pixelValue variable al valor del píxel actual usando el getPixel32 () Método que usamos anteriormente, pero esta vez, nota que hemos usado 0 para el segundo parámetro que es y, por lo que sólo vamos a procesar la primera línea horizontal de píxeles.

Después de esto, hay una matemática bastante compleja conocida como enmascaramiento y desplazamiento de bits. Para ahorrar un poco de tiempo, puede asumir que cada uno de los colores se extrae de la pixelValue variable y luego de salida para que podamos ver usando rastro(). Si desea obtener más información sobre los operadores bitwise, el desplazamiento de bits y el enmascaramiento, puede encontrar una excelente publicación en el sitio web de Polygonal Labs..

Lo que deberías ver es la salida de un montón de 0 Valores, pero prestar atención a los dos alfa: 255 líneas, estos son los dos píxeles negros en la parte superior de la mano.


Paso 13: Crear objetos 3D a partir de los valores de píxeles

¡Vaya, había bastante lógica en esos últimos pasos! Ahora que tenemos los conceptos básicos en funcionamiento, comencemos a usar la información de píxeles que obtuvimos anteriormente para crear una obra maestra en 3D. casi.

Si ha usado Away3D o Papervision 3D antes de familiarizarse con este paso, comenzaremos a crear cubos 3D y aplicarles materiales. Para cada píxel que es alfa es 255 (opaco) tomamos su color y creamos un material basado en el color que se aplicará a un cubo 3D, a continuación se muestra el código para comenzar:

 / ** * comienza el proceso de creación * / public function createFromMovieClip (mc: MovieClip): void // almacena las referencias y crea el bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // establece width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixel information var pixelValue: uint = 0; var rojo: uint = 0; var verde: uint = 0; var azul: uint = 0; var alfa: uint = 0; // recorre cada píxel horizontalmente para (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 y 0xFF; rojo = pixelValue >> 16 & 0xFF; verde = pixelValue >> 8 & 0xFF; azul = pixelValue & 0xFF; // si el píxel es opaco si (alfa == 255) // crea una cadena de color hexadecimal normal, es decir, FFFFFF o 000000 var color: String = red.toString (16) + green.toString (16) + blue.toString (16 ); if (color == "000") color = "000000"; traza ("#" + color); // crear un material del color y aplicar a un cubo 3D material var: Material = nuevo ColorMaterial (color); var cube: Cubo = nuevo Cubo (material: material, ancho: 2 * _scaleFactor, altura: 2 * _scaleFactor, profundidad: 2 * _scaleFactor); // posicionar el cubo desde un valor - de modo que el punto de registro / transformación siempre sea el centro cube.x = 0 - (_width / 2) + cube.width * i; this.addChild (cubo); 

En el código anterior hemos utilizado el rojo, verde y azul variables y creó un color hexadecimal regular, que puede ver el resultado de la rastro().

Entonces el color hexadecimal color variable se utiliza para crear una Colormaterial con Away3D, que es solo un material regular basado en un color que se puede aplicar a objetos 3D.

A continuación creamos un Cubo objeto y especifique el material ser el material Objeto creamos la línea anterior. También vale la pena señalar aquí es que hemos establecido la anchura, altura y profundidad (recuerde que ahora estamos trabajando en tres dimensiones) a un valor del doble del valor de _scaleValue variable, esto nos permite hacer los cubos más grandes o más pequeños cambiando _scaleValue.

Por último posicionamos el Cubo a cero menos la mitad del ancho de la mc multiplicado por el para contador de bucles yo, esto hace que el punto de registro o transformación del objeto 3D terminado en el centro. Luego se agrega como niño y cuando hagas la prueba verás dos pequeñas 3D en negro Cubo objetos.


Paso 14: Filas y columnas

Ahora, dos cubos 3D son geniales y todos, pero realmente queremos que toda la forma de la mano se convierta en cubos 3D. Ya estamos usando un para bucle para recorrer todos los píxeles de la primera fila, pero ¿cómo podemos hacer que circule a través de las filas de píxeles restantes??

Lo has adivinado, otro para lazo!

 / ** * comienza el proceso de creación * / public function createFromMovieClip (mc: MovieClip): void // almacena las referencias y crea el bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // establece width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // pixel information var pixelValue: uint = 0; var rojo: uint = 0; var verde: uint = 0; var azul: uint = 0; var alfa: uint = 0; // recorre cada fila de píxeles para (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 y 0xFF; rojo = pixelValue >> 16 & 0xFF; verde = pixelValue >> 8 & 0xFF; azul = pixelValue & 0xFF; // si el píxel es opaco si (alfa == 255) // crea una cadena de color hexadecimal normal, es decir, FFFFFF o 000000 var color: String = red.toString (16) + green.toString (16) + blue.toString (16 ); if (color == "000") color = "000000"; traza ("#" + color); // crear un material del color y aplicar a un cubo 3D material var: Material = nuevo ColorMaterial (color); var cube: Cubo = nuevo Cubo (material: material, ancho: 2 * _scaleFactor, altura: 2 * _scaleFactor, profundidad: 2 * _scaleFactor); // posicionar el cubo desde un valor - de modo que el punto de registro / transformación siempre sea el centro cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; this.addChild (cubo); 

Esta vez solo hemos cambiado tres cosas, una nueva para bucle que esta vez tiene j por su contador. los getPixel32 () ahora tiene el j variable añadida como la y parámetro y por último el Cubo se coloca verticalmente utilizando el j mostrador.

Esto completa bastante la lógica principal, ahora se desplazará horizontalmente, leerá los valores de píxeles, creará una Colormaterial y un Cubo y posicionarlos en consecuencia. Una vez que llega al final de la línea horizontal, debido a la nueva para en bucle pasará al siguiente píxel hacia abajo y continuará en forma horizontal hasta que la imagen se complete. Echa un vistazo por ti mismo probando la película:


Paso 15: En la tercera dimensión

Ahora tenemos todos estos objetos en 3D, pero se ven muy en 2D, por lo que vamos a agregar un poco de movimiento y lograr que todo el objeto gire.

Para ello tendremos que hacer un seguimiento de la Main.as archiva y localiza el renderLoop () método. Recuerde que Away3D deberá renderizar (o pintar) la imagen 3D en cada fotograma, para que podamos agregar algunas rotaciones simples a nuestro PixelObject3D ver a todo el niño Cubitos girar:

 / ** * el bucle de procesamiento * / la función privada renderLoop (evento: Evento): void pObject3D.rotationZ ++; view.render (); 

Siéntete libre de experimentar con rotaciónX, rotaciónY y rotación z aquí solo recuerda restablecerlo al código anterior antes de continuar. También puede agregar a la create3DObject () para centrar mejor y alinear el Cubitos a la camara.

 / ** * crea un objeto de píxel 3D desde un MovieClip * / public function create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img1 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Paso 16: Explosionando el PixelObject3D

Ahora que esto es más parecido, finalmente podemos ver el objeto de píxel 3D girando. Podemos comenzar a ajustar esto y agregar una vista explosionada simplemente editando el z valor de la Cubitos cuando los creamos.

Saltar de nuevo a la PixelObject3d.as Clase y encontrar las líneas donde colocamos el Cuboes X y y y añade lo siguiente:

 // si el píxel es opaco si (alfa == 255) // crea una cadena de color hexadecimal normal, es decir, FFFFFF o 000000 var color: String = red.toString (16) + green.toString (16) + blue.toString (16 ); if (color == "000") color = "000000"; traza ("#" + color); // crear un material del color y aplicar a un cubo 3D material var: Material = nuevo ColorMaterial (color); var cube: Cubo = nuevo Cubo (material: material, ancho: 2 * _scaleFactor, altura: 2 * _scaleFactor, profundidad: 2 * _scaleFactor); // posicionar el cubo desde un valor - de modo que el punto de registro / transformación siempre sea el centro cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; cube.z = -25 + (Math.random () * 50); this.addChild (cubo); 

Esto moverá cada Cubo a una profundidad aleatoria de -25 a positivo 25 y crea un efecto explotado agradable:


Paso 17: escalado

Como el PixelObject3D Es un poco pequeño en la pantalla, vamos a ajustar la escala ligeramente. Podemos hacer esto rápidamente ajustando el _scaleValue variable en el PixelObject3D.as clase y aumentándolo a 1.5.

 / ** * crea un objeto 3D desde MovieClip * * @author Anton Mills * / clase pública PixelObject3D extiende ObjectContainer3D // propiedades protegidas var _bitmapData: BitmapData = null; public var _scaleFactor: Number = 1.5; var _width protegido: Número = 0; var _height protegido: Número = 0;

Paso 18: Diferentes imágenes

Utilizando la PixelObject3D la clase para crear otras imágenes es fácil, simplemente importe la imagen que desea procesar en Flash. Luego conviértalo a MovieClip como de costumbre, esta vez déle un Nombre de la clase de img2 Me gusta esto:

Ahora puedes alterar Main.as usar el nuevo img2 Objeto con una pequeña alteración:

 / ** * crea un objeto de píxel 3D desde un MovieClip * / public function create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img2 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Paso 19: Múltiples objetos

Puedes usar tantos como quieras, solo asegúrate de agregarlos a la escena Away3D y podrías tener varios. En este ejemplo he quitado el z Propiedad que usamos en el Paso 16 para el efecto de explosión..

Main.as con otro PixelObject3D adicional:

 / ** * Un tutorial destinado a introducir BitmapData * de ActionScript 3 y cómo utilizar la información de BitmapData para crear una forma de píxel 3D * utilizando Away3D. * * @autor Anton Mills * / public class Main extiende MovieClip // propiedades básicas de Away3D protegidas var scene: Scene3D; cámara var protegida: TargetCamera3D; Vista de var protegida: View3D; protegido var pObject3D: PixelObject3D; protegido var pObject3D2: PixelObject3D;

Luego crea otra instancia:

 / ** * crea un objeto de píxel 3D desde un MovieClip * / public function create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img2 ()); pObject3D.x = 40; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); pObject3D2 = nuevo PixelObject3D (); pObject3D2.createFromMovieClip (new img1 ()); pObject3D2.x = 115; pObject3D2.y = -55; pObject3D2.rotationX = -5; scene.addChild (pObject3D2); 

Y por último rotarlo en el bucle de renderización de Away3D:

 / ** * el bucle de procesamiento * / la función privada renderLoop (evento: Evento): void pObject3D.rotationY ++; pObject3D2.rotationY--; pObject3D2.rotationZ--; pObject3D2.rotationX ++; view.render (); 

Paso 20: Aleta.

Todo lo que queda es para que pruebes tu película y disfrutes de lo maravilloso de los píxeles 2D transformados en objetos 3D. Ahora, ¿qué puedes hacer con BitmapData en tu próxima aplicación o juego?


Conclusión

A través de este tutorial, hemos analizado una mezcla de elementos, pero nos hemos centrado principalmente en BitmapData uso como el dibujo Clips de película dentro BitmapData, utilizando setPixel32 () para dibujar píxeles individuales, mostrando la BitmapData usando un Mapa de bits y leyendo valores de pixel usando getPixel32 ().

También hemos cubierto algunos cálculos de color, obteniendo colores hexadecimales e incluso valores alfa, rojo, verde y azu