Archive for the 'AS3' CategoryPage 2 of 2

Papervision 2.0 – Exploding and Rebuilding an Image

[kml_flashembed movie="image-explode.swf" height="300" width="550" /]

I took some time last week to have some fun with Papervision. The goal was to just take an image (any image) and have it explode into pieces and then rebuild it. While searching around for code or tutorials I have only found a few where the items on the stage go back into a controlled state. So over the next few weeks I am going to try to create a few examples of things that could be used IN a website rather than having the Papervision BE the website. I am not sure that makes sense. While I love experiments I like to have things I can use on everyday websites. This example I probably be using when I launch my new site. It's just something to break away from the ole fade in and out motion.

If you want to test this code on your own computer you will need to download a few things first. :)

1) Papervision 2.0

2) Foomonger's Code (Call Later)

3) Tweener

4) The Source

Actionscript:
  1. package
  2. {
  3. import flash.display.*;
  4. import flash.events.*;
  5. import flash.geom.Matrix;
  6. import flash.geom.Point;
  7.  
  8. import caurina.transitions.*
  9.  
  10. import com.foomonger.utils.Later;
  11.  
  12. import org.papervision3d.cameras.FreeCamera3D;
  13. import org.papervision3d.materials.BitmapFileMaterial;
  14. import org.papervision3d.materials.MovieMaterial;
  15. import org.papervision3d.objects.DisplayObject3D;
  16. import org.papervision3d.objects.primitives.Plane;
  17. import org.papervision3d.render.BasicRenderEngine;
  18. import org.papervision3d.scenes.Scene3D;
  19. import org.papervision3d.view.Viewport3D;
  20.  
  21. public class PVImageExplode extends MovieClip
  22. {
  23. private var viewport        :Viewport3D;
  24. private var scene            :Scene3D;
  25. private var camera            :FreeCamera3D;
  26.  
  27. private var block            :BitmapFileMaterial;
  28. private var movieBlock        :MovieMaterial;
  29.  
  30. private var blocksArray    :Array;
  31. private var planeArray        :Array;
  32. private var clips_array        :Array;
  33.  
  34. private var renderer        :BasicRenderEngine;
  35.  
  36. private var __holder        :D isplayObject3D;
  37. private var __startCamZ        :Number;
  38.  
  39. private var __homePage        :MovieClip;
  40. private var __grass            :D isplayObject;
  41. private var __grassHolder    :MovieClip;
  42.  
  43. private var __col            :Number;
  44. private var __rows            :Number;
  45. private var __blockWidth    :Number;
  46. private var __blockHeight    :Number;
  47.  
  48. private var __yawAmount        :Number = 0;
  49.  
  50. public function PVImageExplode()
  51. {
  52. init()
  53. }
  54.  
  55. private function init():void
  56. {
  57. createChildren();
  58. size();
  59.  
  60. initPapervision();
  61. initMaterials();
  62. initObjects();
  63. initEvents();
  64. }
  65.  
  66. //-----------------------------------------------------------------------
  67. //Adds image to the stage to be then broke apart
  68. //-----------------------------------------------------------------------
  69.  
  70. protected function createChildren():void
  71. {
  72.  
  73. __grassHolder            = new MovieClip();
  74. __grass                = new GrassItem();
  75. __grassHolder.visible    = false;
  76. __grassHolder.addChild(__grass)
  77.  
  78. addChild(__grassHolder);
  79.  
  80. }
  81.  
  82. protected function size():void
  83. {
  84. __col            = 4;
  85. __rows            = 10;
  86.  
  87. }
  88.  
  89. //-----------------------------------------------------------------------
  90. //Papervision init setup
  91. //-----------------------------------------------------------------------
  92.  
  93. private function initPapervision():void
  94. {
  95. viewport                        = new Viewport3D(1000,600,false,true,false);
  96. addChild(viewport);
  97.  
  98. scene                            = new Scene3D();
  99. camera                            = new FreeCamera3D();
  100. renderer                        = new BasicRenderEngine();
  101.  
  102. camera.zoom = 11;
  103. __startCamZ = -6000
  104.  
  105. }
  106.  
  107. //-----------------------------------------------------------------------
  108. //Papervision materials setup
  109. //-----------------------------------------------------------------------
  110.  
  111. private function initMaterials():void
  112. {
  113. blocksArray = [];
  114.  
  115. clips_array            = new Array();
  116.  
  117. var __w:int            =Math.ceil(__grassHolder.width / __col);
  118. var __h:int            =Math.ceil(__grassHolder.height / __rows);
  119.  
  120. __blockWidth    = __w;
  121. __blockHeight    = __h;
  122.  
  123. var matrix            :Matrix;
  124. var bitmap_data        :BitmapData;
  125. var point            :P oint;
  126. var clip            :MovieClip;
  127. var columns            :Number             = __col;
  128. var cellWidth        :Number             = __blockWidth;
  129. var cellHeight        :Number             = __blockHeight;
  130. var cellX            :Number
  131. var cellY            :Number
  132. var bx                :Number
  133. var by                :Number
  134. var bitmap            :Bitmap
  135.  
  136. for (var i:int=0; i <(__rows * __col); i++)
  137. {
  138.  
  139. cellX        = i % columns;
  140. cellY        = Math.floor(i / columns);
  141.  
  142. bitmap_data            = new BitmapData(__w,__h,true,0x00FFFFFF);
  143. matrix                = __grassHolder.transform.matrix;
  144.  
  145. bx = (cellX * cellWidth);
  146. by = cellY * cellHeight;
  147.  
  148. matrix.translate(-__w * cellX, -__h * cellY);
  149.  
  150. bitmap_data.draw(__grassHolder,matrix);
  151. clip = new MovieClip();
  152. clips_array.push(clip);
  153. clip.id = i;
  154. addChild(clip);
  155.  
  156. point = new Point(__grassHolder.x + __w * cellX, __grassHolder.y + __h * cellY);
  157.  
  158. bitmap =new Bitmap(bitmap_data);
  159. clip.addChild(bitmap);
  160.  
  161. clip.visible = false;
  162. clip.x = point.x;
  163. clip.y = point.y;
  164. }
  165.  
  166. for(var k:uint = 0;k<clips_array.length;k++)
  167. {
  168. movieBlock = new MovieMaterial(clips_array[k],true);
  169. movieBlock.doubleSided = true;
  170. blocksArray.push(movieBlock);
  171. }
  172.  
  173. }
  174.  
  175. //-----------------------------------------------------------------------
  176. //Papervision objects setup (planes etc)
  177. //-----------------------------------------------------------------------
  178.  
  179. private function initObjects():void
  180. {
  181.  
  182. planeArray = [];
  183.  
  184. __holder        = new DisplayObject3D();
  185. __holder.x        = -420;
  186. __holder.y        = 280
  187.  
  188. scene.addChild(__holder);
  189.  
  190. for(var k:uint = 0;k<blocksArray.length;k++)
  191. {
  192. var plane:Plane = new Plane(blocksArray[k],__blockWidth,__blockHeight,3,3);
  193.  
  194. var columns:Number        = __col;
  195. var cellWidth:Number    = __blockWidth;
  196. var cellHeight:Number    = -__blockHeight;
  197. var cellX:Number        = k % columns;
  198. var cellY:Number        = Math.floor(k / columns);
  199.  
  200. plane.x = (cellX * cellWidth);
  201. plane.y = cellY * cellHeight;
  202.  
  203. planeArray.push({plane:plane,pX:plane.x,pY:plane.y,pZ:plane.z,pR:plane.rotationY})
  204.  
  205. __holder.addChild(plane);
  206. }
  207. Later.call(this, explode, 500, true);
  208. }
  209.  
  210. //-----------------------------------------------------------------------
  211. //Start enterframe render event
  212. //-----------------------------------------------------------------------
  213.  
  214. public function initEvents():void
  215. {
  216. this.addEventListener(Event.ENTER_FRAME,renderEvent);
  217. }
  218.  
  219. //-----------------------------------------------------------------------
  220. //Killin it
  221. //-----------------------------------------------------------------------
  222.  
  223. public function killEvents():void
  224. {
  225. this.removeEventListener(Event.ENTER_FRAME,renderEvent);
  226. }
  227.  
  228. //-----------------------------------------------------------------------
  229. //Render the stage
  230. //-----------------------------------------------------------------------
  231.  
  232. protected function renderEvent(e:Event):void
  233. {
  234. for(var i:uint = 0; i<planeArray.length;i++)
  235. {
  236. var plane = planeArray[i].plane;
  237.  
  238. plane.yaw(__yawAmount);
  239.  
  240. }
  241.  
  242. renderer.renderScene(scene,camera,viewport);
  243. }
  244.  
  245. protected function resumeYaw():void
  246. {
  247. __yawAmount = 10;
  248. }
  249.  
  250. //-----------------------------------------------------------------------
  251. //The explosive magic (could be on a button click instead of later calls)
  252. //-----------------------------------------------------------------------
  253.  
  254. protected function explode(e:Event = null):void
  255. {
  256. for(var i:uint = 0; i<planeArray.length;i++)
  257. {
  258. var plane = planeArray[i].plane;
  259. var __x:Number = Math.random() * 3000 - 1000;
  260. var __y:Number = Math.random() * 1000 - 500;
  261. var __z:Number = Math.random() * 1000 - 500;
  262. var __rY:Number = Math.random()* 720;
  263.  
  264. Tweener.addTween(plane,{x:__x,y:__y,z:__z,rotationY:__rY,transition:"easeInOutQuint",time:1})
  265. }
  266.  
  267. Tweener.addTween(camera,{z:__startCamZ,x:1000,y:-400,transition:"easeInOutQuint",time:1,onComplete:resumeYaw})
  268.  
  269. Later.call(this, putBackTogether, 5000, true);
  270. }
  271.  
  272. //-----------------------------------------------------------------------
  273. //The Humpty Dumpty
  274. //-----------------------------------------------------------------------
  275.  
  276. protected function putBackTogether(e:Event = null):void
  277. {
  278. Tweener.addTween(camera,{z:-1000,x:0,y:0,transition:"easeOutQuint",time:.3})
  279. __yawAmount = 0;
  280. for(var i:uint = 0; i<planeArray.length;i++)
  281. {
  282. var plane:Plane = planeArray[i].plane;
  283. var __x:Number = planeArray[i].pX
  284. var __y:Number = planeArray[i].pY
  285. var __z:Number = planeArray[i].pZ
  286. var __rY:Number = planeArray[i].pR
  287.  
  288. Tweener.addTween(plane,{x:__x,y:__y,z:__z,rotationY:__rY,delay:.3,transition:"easeInOutQuint",time:1})
  289. }
  290. Later.call(this, explode, 5000, true);
  291. }
  292.  
  293. }
  294. }


Follow papervision2 on Twitter

RSS Feed