Travailler au niveau des pixels avec BitmapData et Away3D

Bienvenue dans cette introduction au travail au niveau des pixels avec l’objet BitmapData d’ActionScript 3. Nous allons prendre des images 2D, les décomposer en leurs pixels composants, puis les ré-assembler en tant qu'images 3D que nous pouvons déplacer et faire pivoter..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:


Étape 1: mise en place

Juste avant de vous lancer, prenons un instant pour regarder comment le projet-type est présenté. En ouvrant le zip source pour ce tutoriel, vous aurez des sources pour chaque étape importante, vous pouvez aller de l'avant et faire une copie du commencer dossier car cela servira de point de départ.

Dans ce dossier, vous trouverez deux autres dossiers. src et poubelle. le src dossier est où nous allons enregistrer tous nos fichiers de code et FLA et la poubelle Le dossier est l'endroit où le Flash enregistrera les fichiers SWF. À l'intérieur de src dossier il y a le Main.FLA et le Main.AS classe de document.

Si, pour une raison quelconque, vous trouvez une erreur dans votre code, essayez de la réparer (il est toujours bon d'apprendre des erreurs), mais si vous ne le pouvez pas, ne vous inquiétez pas! Vous pouvez revenir directement et utiliser l’un des dossiers d’étapes du fichier zip source le plus proche de l’étape sur laquelle vous vous trouviez..


Étape 2: Téléchargez Away3D

Si vous avez déjà eu un aperçu de la Main.as Dans ce fichier, vous remarquerez déjà quelques références à Away3D, un framework 3D pour Flash. Nous allons avoir besoin de télécharger ceci et de l'ajouter à notre projet pour continuer.

Vous pouvez récupérer leur dernière version sur le site Away3D.

Une fois ce téléchargement terminé, ouvrez le fichier zip et à l'intérieur du répertoire. loin3d_3_6_0 \ src dossier, vous trouverez trois dossiers, loin3d, nochump et wumedia. Copiez-les, comme indiqué ci-dessous, dans votre src dossier.


Étape 3: le fichier Flash

Si vous ne l'avez pas déjà fait, ouvrez Main.fla et Main.as. En regardant dans la bibliothèque Flash, vous pouvez voir une image appelée 1.png et un MovieClip avec un nom d'instance de img1, qui servira de conteneur de base pour le png.

Nous allons effectuer une compilation rapide juste pour nous assurer que nous avons correctement ajouté Away3D. Si tout se passe bien, nous devrions voir une animation Flash vierge avec un fond gris foncé et aucun message d'erreur de la part de Flash..


Étape 4: Le fichier Main.as

Examiner le Main.as fichier nous pouvons voir quelques variables qui sont utilisées dans Away3D, il existe déjà une foule de tutoriels sur Away3D mais nous allons rapidement les récapituler:

 // propriétés Away3D de base protected var scene: Scene3D; caméra var protégée: TargetCamera3D; vue var protégée: View3D;
  • Scene3D est un espace que nous pouvons utiliser pour ajouter des objets 3D tels que des cubes et des sphères.
  • TargetCamera3D est l’un des nombreux types de caméras disponibles dans Away3D, c’est ce que nous utilisons pour regarder le Scene3D.
  • View3D est une fenêtre, souvent décrite comme la "fenêtre" dans laquelle nous voyons notre scène.

Sans entrer dans les détails, vous pouvez également voir une scène de base est configurée prête à être utilisée avec le initAway3d () méthode. Notez qu'il ajoute un ENTER_FRAME EventListener, cela dit simplement à Away3D de rendre() (ou dessinez) tout objet ajouté à la Scene3D chaque image.

 / ** * Configuration de scène de base Away3D * / fonction privée initAway3d (): void scene = new Scene3D (); camera = new TargetCamera3D (z: -200); view = new View3D (scene: scene, camera: camera); addChild (voir); addEventListener (Event.ENTER_FRAME, renderLoop);  / ** * la boucle de rendu * / fonction privée renderLoop (event: Event): void view.render (); 

C’est à peu près tout pour l’introduction à la Main.as classe, nous allons construire tout le reste que nous allons.


Étape 5: Bitmaps et BitmapData

Nous allons passer directement à ces deux classes et les présenter tout au long du didacticiel. Si vous êtes nouveau à Bitmap et BitmapData vous pouvez les considérer comme une toile de peintre et une collection de taches de peinture. Ce sont des objets totalement différents mais connectés, le BitmapData contient toutes les informations de pixels ou de coups de pinceau et ne serait rien sans être peint sur une toile ou dans ce cas, le Bitmap!

Testons cela en ajoutant une instance de la img1 MovieClip au étape et en faire une copie en utilisant Bitmap / BitmapData.

Modifier le paragraphe principal comme suit:

 / ** * constructeur * / fonction publique Main () initAway3d (); drawExample ();  / ** * exemple rapide d'utilisation de BitmapData et Bitmap * / fonction privée drawExample (): void // crée une instance de l'objet img1 sur la scène pour copier var img: MovieClip = new img1 (); addChild (img); // crée un objet BitmapData avec les paramètres suivants: width, height, transparent, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dessine une copie du MovieClip img dans BitmapData bmpData.draw (img); // ajoute un bitmap à la scène avec les informations BitmapData (copie de img1) pour afficher var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

En regardant le drawExample () code, les deux premières lignes ajoutent simplement le img1 objecter à la étape, c'est l'image que nous allons faire de la copie de.

Ensuite, nous créons un BitmapData objet avec les paramètres suivants:

  • largeur, la largeur pour faire la BitmapData
  • la taille, la hauteur pour faire la BitmapData
  • transparent, si le BitmapData doit contenir des pixels transparents
  • Couleur, la couleur de fond

Comme nous connaissons la largeur et la hauteur de img1 nous les avons définies directement, car nous aurons besoin de transparence, nous définissons le paramètre suivant sur true et, enfin, nous spécifions 0x000000 ou noir comme couleur de fond car ça va paraître transparent jusqu'à ce que nous le remplissions.


Étape 6: Bitmaps et BitmapData Suite

En continuant, nous avons maintenant le BitmapData Pour configurer un objet, nous avons plusieurs options à notre disposition, nous pouvons par exemple parcourir en boucle pixel par pixel et copier l’image (nous utiliserons quelque chose comme cela plus tard dans le tutoriel), ou nous pourrions utiliser le dessiner() méthode.

le dessiner() méthode prend un MovieClip ou Lutin en tant que paramètre et copiera toutes les informations de pixel de l'objet vers le BitmapData.

 / ** * exemple rapide d'utilisation de BitmapData et Bitmap * / fonction privée drawExample (): void // crée une instance de l'objet img1 sur la scène pour copier var img: MovieClip = new img1 (); addChild (img); // crée un objet BitmapData avec les paramètres suivants: width, height, transparent, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dessine une copie du MovieClip img dans BitmapData bmpData.draw (img); // ajoute un bitmap à la scène avec les informations BitmapData (copie de img1) pour afficher var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

Suite à cela, les lignes suivantes créent un Bitmap objet avec le BitmapData informations de pixel en tant que paramètre, qui est ensuite déplacé en dessous de l'original img MovieClip et ajouté à la étape.

 / ** * exemple rapide d'utilisation de BitmapData et Bitmap * / fonction privée drawExample (): void // crée une instance de l'objet img1 sur la scène pour copier var img: MovieClip = new img1 (); addChild (img); // crée un objet BitmapData avec les paramètres suivants: width, height, transparent, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dessine une copie du MovieClip img dans BitmapData bmpData.draw (img); // ajoute un bitmap à la scène avec les informations BitmapData (copie de img1) pour afficher var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); 

Il n'y a pas beaucoup de configuration impliquée dans la configuration de la Bitmap aspect, il affiche simplement un BitmapData, toute la magie est avec le BitmapData. Maintenant, lors des tests, nous devrions obtenir les éléments suivants:


Étape 7: Lecture des informations sur les pixels

Maintenant, nous avons du contenu à l'intérieur du BitmapData les choses d'objet commencent à devenir intéressant que nous pouvons commencer à manipuler des images en utilisant getPixel32 () et setPixel32 ().

Commençant par getPixel32 () modifier le drawExample () code ci-dessus à ce qui suit:

 / ** * exemple rapide d'utilisation de BitmapData et Bitmap * / fonction privée drawExample (): void // crée une instance de l'objet img1 sur la scène pour copier var img: MovieClip = new img1 (); addChild (img); // crée un objet BitmapData avec les paramètres suivants: width, height, transparent, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dessine une copie du MovieClip img dans BitmapData bmpData.draw (img); // ajoute un bitmap à la scène avec les informations BitmapData (copie de img1) pour afficher var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); // lit les informations de pixel à partir de BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); trace (pixelInformation, pixelInformation.toString (16)); 

En examinant le code, nous avons créé une variable uint régulière et l'avons affectée à la valeur du pixel dans le bmpData à 5 pixels horizontalement et à 0 pixel verticalement. Rappelez-vous que les valeurs commencent à 0 comme suit:

Sachant que nous avons choisi d'obtenir les informations sur les pixels pour 5,0, cela ferait en sorte que les pixels noirs apparaissent sur la rangée supérieure et que suffisamment de sorties Flash soient disponibles: 4278190080 ff000000

Cela peut ne pas sembler juste au début, mais setPixel32 lit la valeur alpha du pixel (où, comme setPixel lit juste la couleur). Nous sommes généralement habitués à travailler avec des valeurs hexadécimales pour des couleurs telles que FFFFFF ou 000000 afin que nous puissions dire à Flash toString (16) pour obtenir la valeur hexadécimale:


Étape 8: Dessin des pixels

Nous savons maintenant comment lire les informations sur les pixels, en dessinant les pixels vers le BitmapData est très similaire, seulement cette fois nous utilisons setPixel32 () dessiner des pixels à BitmapData, et nous allons aussi jeter un pour boucle pour dessiner des pixels.

Commencez par modifier le code comme suit:

 / ** * exemple rapide d'utilisation de BitmapData et Bitmap * / fonction privée drawExample (): void // crée une instance de l'objet img1 sur la scène pour copier var img: MovieClip = new img1 (); addChild (img); // crée un objet BitmapData avec les paramètres suivants: width, height, transparent, color var bmpData: BitmapData = new BitmapData (img.width, img.height, true, 0x000000); // dessine une copie du MovieClip img dans BitmapData bmpData.draw (img); // ajoute un bitmap à la scène avec les informations BitmapData (copie de img1) pour afficher var bmp: Bitmap = new Bitmap (bmpData); bmp.y = img.height; addChild (bmp); // lit les informations de pixel à partir de BitmapData var pixelInformation: uint = bmpData.getPixel32 (5, 0); trace (pixelInformation, pixelInformation.toString (16)); // écrit les informations de pixel dans BitmapData var color: uint = 0xffff0000; // ff0000 - rangée de var rouge: uint = 0; var colonne: uint = 0; pour (rangée; rangée < bmpData.height; row++)  bmpData.setPixel32(column, row, color); column++; if(column > bmpData.width) column = 0; 

Le nouveau code commence par créer un journal uint variable nommée Couleur que nous stockons 0xffff0000 qui est: ff entièrement transparent, ff entièrement rouge, 00 pas de vert, 00 pas de bleu.

Ensuite, deux compteurs sont créés pour les lignes et les colonnes (les lignes sont une ligne de pixels horizontaux, les colonnes sont une ligne de pixels verticaux). Ces compteurs sont ensuite placés dans un pour boucle qui augmente la valeur de la ligne et du compteur à chaque fois, donc mélangé avec le setPixel32 () méthode, il va tracer une ligne diagonale:


Étape 9: La classe PixelObject3D

Dans cette étape, nous allons présenter le PixelObject3D.as classe. Pour gagner un peu de temps, prenez une copie de la classe à partir du Étape 8 dossier dans le zip source et déposez-le dans votre src dossier à côté du Main.fla et Main.as.

Une fois que cela est fait, examinons-le rapidement avant de commencer à ajouter le code permettant de créer des objets 3D à partir de pixels..

 // propriétés protégées var _bitmapData: BitmapData = null; public var _scaleFactor: Number = 1; var_width protégé: Number = 0; protected var _height: Number = 0;

Nous avons quelques variables protégées en haut de la classe, une pour un BitmapData et trois Nombres pour la largeur, la hauteur et une échelle de l'objet.

 / ** * constructeur * / fonction publique PixelObject3D ()  / ** * lance le processus de création * / fonction publique createFromMovieClip (mc: MovieClip): void 

Les suivant est un constructeur de classe vide et la méthode avec laquelle nous allons travailler, createFromMovieClip (). Vous remarquerez que cette méthode prend un paramètre de MovieClip comme vous le savez déjà, nous passons un MovieClip et cela nous en redonnera une représentation en 3D. Quand c'est fini c'est!


Étape 10: Une instance de la classe PixelObject3D

Tandis que le PixelObject3D.as la classe ne fait rien encore mais ajoutons une instance de celle-ci à la Main.as classe afin que nous puissions réellement voir les changements à l'écran alors que nous allons.

Commençant par ajouter une variable privée:

 // propriétés Away3D de base protected var scene: Scene3D; caméra var protégée: TargetCamera3D; vue var protégée: View3D; // le var protégé Pixel3DObject po3d: PixelObject3D;

Après cela, ajoutez au constructeur un appel à createPixelObect3D ().

 / ** * constructeur * / fonction publique Main () initAway3d (); drawExample (); createPixelObect3D (); 

Enfin, ajoutez la fonction suivante au Main.as fichier. Cela va créer une instance du PixelObject3D classe, invoque le createFromMovieClip () méthode et passer une nouvelle MovieClip, la img1 nous avons utilisé précédemment.

Une dernière ligne à souligner est que nous ajoutons le PixelObject3D classe en tant qu'enfant de la scène car c'est un objet 3D, pas le Étape.

 / ** * crée une fonction PixelObject3D * / private createPixelObect3D (): void po3d = new PixelObject3D (); po3d.createFromMovieClip (new img1 ()); scene.addChild (po3d); 

Étape 11: createFromMovieClip (mc: MovieClip)

Sachant que nous sommes passés le MovieClip nous voulons recréer à partir de cette méthode, la première chose à faire à notre ordre du jour est d’en faire une copie en utilisant BitmapData exactement comme nous le faisions auparavant. Nous pouvons ensuite utiliser les données de pixels pour commencer à créer des objets 3D.

Comme avant, nous allons créer un BitmapData objet et dessiner le mc MovieClip objet:

 / ** * commence le processus de création * / fonction publique createFromMovieClip (mc: MovieClip): void // enregistre les références et crée le bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // set width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); 

Nous avons également mis le _largeur et _la taille variables en fonction de la mc largeur et hauteur et multipliez cela par le _facteur d'échelle variable, cela nous permet d’augmenter ou de réduire la taille des pixels 3D si nous le souhaitons. Plus sur cela plus tard.


Étape 12: createFromMovieClip (mc: MovieClip)

N'oubliez pas que BitmapData ne contient que des informations sur les pixels. Sans l'ajout de BitmapData à un bitmap, nous ne pourrons le voir, mais nous pourrons toujours le lire et l'écrire. C’est parfait pour nous car nous allons utiliser cette étape pour commencer à parcourir en boucle les pixels de BitmapData et à séparer les valeurs rouge, verte, bleue et alpha..

Modifier votre createFromMovieClip () méthode pour correspondre à ceci:

 / ** * commence le processus de création * / fonction publique createFromMovieClip (mc: MovieClip): void // enregistre les références et crée le bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // set width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // information de pixel var pixelValue: uint = 0; var rouge: uint = 0; var green: uint = 0; var bleu: uint = 0; var alpha: uint = 0; // boucle chaque pixel horizontalement pour (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 & 0xFF; red = pixelValue >> 16 & 0xFF; green = pixelValue >> 8 & 0xFF; blue = pixelValue & 0xFF; trace ("alpha:" + alpha + "rouge:" + rouge + "vert:" + vert + "bleu:" + bleu); 

Ici, nous avons défini quelques variables pour les valeurs de couleur et alpha, puis avons démarré une pour boucle basée sur le mc's largeur.

Ce pour boucle définit le pixelValue variable à la valeur du pixel actuel en utilisant le getPixel32 () méthode que nous avons utilisée plus tôt, mais cette note de temps, nous avons utilisé 0 pour le second paramètre qui est y, donc nous allons seulement traiter la première ligne horizontale de pixels.

Suite à cela, il y a quelques mathématiques assez complexes appelées masquage et décalage de bits. Pour gagner un peu de temps, vous pouvez supposer que chacune des couleurs est extraite du pixelValue variable et ensuite sortie pour nous de voir en utilisant trace(). Si vous souhaitez en savoir plus sur les opérateurs au niveau des bits, le décalage et le masquage de bits, vous pouvez trouver un excellent poste sur le site Web de Polygonal Labs..

Ce que vous devriez voir est la sortie de tout un tas de 0 valeurs, mais faites attention aux deux alpha: 255 lignes, ce sont les deux pixels noirs en haut de la main.


Étape 13: Création d'objets 3D à partir des valeurs de pixel

Ouf, il y avait beaucoup de logique dans ces dernières étapes! Maintenant que nous connaissons les bases, commençons à utiliser les informations sur les pixels obtenues précédemment pour créer un chef-d’œuvre 3D. presque.

Si vous avez déjà utilisé Away3D ou Papervision 3D, vous allez commencer à créer des cubes 3D et à leur appliquer des matériaux. Pour chaque pixel dont l'alpha est égal à 255 (opaque), nous prenons sa couleur et créons un matériau basé sur la couleur à appliquer à un cube 3D. Voici le code pour lancer ceci:

 / ** * commence le processus de création * / fonction publique createFromMovieClip (mc: MovieClip): void // enregistre les références et crée le bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // set width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // information de pixel var pixelValue: uint = 0; var rouge: uint = 0; var green: uint = 0; var bleu: uint = 0; var alpha: uint = 0; // boucle chaque pixel horizontalement pour (var i: int = 0; i < mc.width; i++)  pixelValue = _bitmapData.getPixel32(i, 0); alpha = pixelValue >> 24 & 0xFF; red = pixelValue >> 16 & 0xFF; green = pixelValue >> 8 & 0xFF; blue = pixelValue & 0xFF; // si le pixel est opaque si (alpha == 255) // crée une chaîne de couleur hexadécimale normale, par exemple FFFFFF ou 000000 couleur var: String = red.toString (16) + green.toString (16) + blue.toString (16 ) if (color == "000") color = "000000"; trace ("#" + couleur); // crée un matériau à partir de la couleur et l'applique à un matériau de cube 3D var: Material = new ColorMaterial (color); var cube: Cube = nouveau Cube (matériau: matériau, largeur: 2 * _scaleFactor, hauteur: 2 * _scaleFactor, profondeur: 2 * _scaleFactor); // positionne le cube à partir d'une - valeur afin que le point d'enregistrement / de transformation soit toujours au centre de cube.x = 0 - (_width / 2) + cube.width * i; this.addChild (cube); 

Dans le code ci-dessus, nous avons utilisé le rouge, vert et bleu variables et créé une couleur hexadécimale régulière, que vous pouvez voir la sortie du trace().

Puis la couleur de l'hex Couleur variable est utilisée pour créer un ColorMaterial avec Away3D, qui est juste un matériau régulier basé sur une couleur qui peut être appliquée à des objets 3D.

Ensuite, nous créons un cube objet et spécifiez le Matériel être le Matériel objet nous avons créé la ligne avant. À noter également que nous avons défini le largeur, la taille et profondeur (souvenez-vous que nous travaillons maintenant en trois dimensions!) à une valeur égale à deux fois la valeur du _scaleValue variable, cela nous permet d’agrandir ou de réduire les cubes en changeant _scaleValue.

Enfin, nous positionnons le cube à zéro moins la moitié de la largeur du mc multiplié par le pour compteur de boucles je, cela fait le point d’enregistrement ou de transformation de l’objet 3D fini au centre. Il est ensuite ajouté comme un enfant et lorsque vous testez, vous verrez deux petites images 3D noires. cube objets.


Étape 14: Lignes et colonnes

Maintenant, deux cubes 3D, c’est génial et nous souhaitons tous obtenir la forme complète de la main pour obtenir des cubes 3D. Nous utilisons déjà un pour boucle pour parcourir tous les pixels de la première ligne, mais comment l'obtenir pour parcourir les lignes restantes de pixels?

Vous l'avez deviné, un autre pour boucle!

 / ** * commence le processus de création * / fonction publique createFromMovieClip (mc: MovieClip): void // enregistre les références et crée le bitmapdata _bitmapData = new BitmapData (mc.width, mc.height, true, 0x000000); _bitmapData.draw (mc); // set width / height _width = mc.width * (2 * _scaleFactor); _height = mc.height * (2 * _scaleFactor); // information de pixel var pixelValue: uint = 0; var rouge: uint = 0; var green: uint = 0; var bleu: uint = 0; var alpha: uint = 0; // boucle chaque ligne de pixels pour (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; red = pixelValue >> 16 & 0xFF; green = pixelValue >> 8 & 0xFF; blue = pixelValue & 0xFF; // si le pixel est opaque si (alpha == 255) // crée une chaîne de couleur hexadécimale normale, par exemple FFFFFF ou 000000 couleur var: String = red.toString (16) + green.toString (16) + blue.toString (16 ) if (color == "000") color = "000000"; trace ("#" + couleur); // crée un matériau à partir de la couleur et l'applique à un matériau de cube 3D var: Material = new ColorMaterial (color); var cube: Cube = nouveau Cube (matériau: matériau, largeur: 2 * _scaleFactor, hauteur: 2 * _scaleFactor, profondeur: 2 * _scaleFactor); // positionne le cube à partir d'une - valeur afin que le point d'enregistrement / de transformation soit toujours au centre de cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; this.addChild (cube); 

Cette fois, nous n’avons vraiment changé que trois choses, une nouvelle pour boucle que cette fois a j pour son comptoir. le getPixel32 () a maintenant le j variable ajoutée en tant que y paramètre et enfin le cube est positionné verticalement à l'aide du j compteur.

Ceci complète à peu près la logique principale, maintenant il va faire une boucle horizontale, lire les valeurs de pixel, créer un ColorMaterial et un cube et les positionner en conséquence. Une fois qu’elle atteint la fin de la ligne horizontale, à cause du nouveau pour En boucle, il passe au pixel suivant et en boucle horizontalement jusqu'à la fin de l'image. Regardez par vous-même en testant le film:


Étape 15: dans la 3ème dimension

Nous avons maintenant tous ces objets 3D, mais ils ont une apparence très 2D. Nous allons donc ajouter un peu de mouvement et faire tourner tout l'objet.

Pour ce faire, nous devrons revenir en arrière à la Main.as déposer et localiser le renderLoop () méthode. N'oubliez pas qu'Away3D devra restituer (ou peindre) l'image 3D chaque image afin que nous puissions ajouter quelques rotations simples à nos images. PixelObject3D voir tout l'enfant Cubes tourner:

 / ** * la boucle de rendu * / fonction privée renderLoop (event: Event): void pObject3D.rotationZ ++; view.render (); 

N'hésitez pas à expérimenter avec rotationX, rotationY et rotationZ rappelez-vous ici de réinitialiser le code ci-dessus avant de continuer. Vous pouvez également ajouter à la create3DObject () pour mieux centrer et aligner le Cubes à la caméra.

 / ** * crée un objet pixel 3D à partir d'une fonction MovieClip * / public create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img1 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Étape 16: Explosion de PixelObject3D

Maintenant, c'est plus comme ça, on peut enfin voir l'objet pixel 3D en rotation. Nous pouvons commencer à peaufiner cela et ajouter une vue éclatée en éditant simplement le z valeur de la Cubes quand on les crée.

Sautez dans le PixelObject3d.as classe et trouver les lignes où nous positionnons la cubede X et y et ajoutez ce qui suit:

 // si le pixel est opaque si (alpha == 255) // crée une chaîne de couleur hexadécimale normale, par exemple FFFFFF ou 000000 couleur var: String = red.toString (16) + green.toString (16) + blue.toString (16 ) if (color == "000") color = "000000"; trace ("#" + couleur); // crée un matériau à partir de la couleur et l'applique à un matériau de cube 3D var: Material = new ColorMaterial (color); var cube: Cube = nouveau Cube (matériau: matériau, largeur: 2 * _scaleFactor, hauteur: 2 * _scaleFactor, profondeur: 2 * _scaleFactor); // positionne le cube à partir d'une - valeur afin que le point d'enregistrement / de transformation soit toujours au centre de cube.x = 0 - (_width / 2) + cube.width * i; cube.y = (_height / 2) + -cube.height * j; cube.z = -25 + (Math.random () * 50); this.addChild (cube); 

Cela va déplacer chaque cube à une profondeur aléatoire de -25 à 25 positives et créer un bel effet éclaté:


Étape 17: Mise à l'échelle

Comme le PixelObject3D est un peu petit sur l’écran, nous allons ajuster légèrement l’échelle. Nous pouvons le faire rapidement en ajustant la _scaleValue variable dans le PixelObject3D.as classe et l'augmentation à 1,5.

 / ** * crée un objet 3D à partir d'un MovieClip * * @author Anton Mills * / classe publique PixelObject3D étend ObjectContainer3D // propriétés protégées var _bitmapData: BitmapData = null; public var _scaleFactor: Number = 1.5; var_width protégé: Number = 0; protected var _height: Number = 0;

Étape 18: Différentes images

En utilisant le PixelObject3D Il est facile de créer une classe pour créer d’autres images. Il vous suffit d’importer dans Flash l’image que vous souhaitez traiter. Puis convertissez-le en MovieClip comme d'habitude, cette fois, donnez-lui une Nom du cours de img2 comme ça:

Maintenant, vous pouvez modifier Main.as utiliser le nouveau img2 objet avec une petite modification:

 / ** * crée un objet pixel 3D à partir d'une fonction MovieClip * / public create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img2 ()); pObject3D.x = 80; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); 

Étape 19: Objets multiples

Vous pouvez en utiliser autant que vous le souhaitez. Assurez-vous simplement de les ajouter à la scène Away3D et vous pourrez en avoir plusieurs. Dans cet exemple, j'ai supprimé le z propriété que nous avons utilisée à l'étape 16 pour l'effet d'explosion.

Main.as avec un autre PixelObject3D ajoutée:

 / ** * Didacticiel visant à présenter BitmapData * d'ActionScript 3 et à utiliser les informations BitmapData pour créer une forme de pixel 3D * à l'aide d'Away3D. * * @author Anton Mills * / classe publique Main étend MovieClip // propriétés de base Away3D protégées var scene: Scene3D; caméra var protégée: TargetCamera3D; vue var protégée: View3D; var protégé pObject3D: PixelObject3D; var protégée pObject3D2: PixelObject3D;

Puis créez une autre instance:

 / ** * crée un objet pixel 3D à partir d'une fonction MovieClip * / public create3DObject (): void pObject3D = new PixelObject3D (); pObject3D.createFromMovieClip (new img2 ()); pObject3D.x = 40; pObject3D.y = -55; pObject3D.rotationX = -5; scene.addChild (pObject3D); pObject3D2 = new PixelObject3D (); pObject3D2.createFromMovieClip (new img1 ()); pObject3D2.x = 115; pObject3D2.y = -55; pObject3D2.rotationX = -5; scene.addChild (pObject3D2); 

Et enfin, faites-le p