Flash picture wall met papervision3D

Flash met Papervision3D
De Papervision 3D engine is een stukje open source software voor Flash 3D fanaten, het maakt een grote stap in de richting van 3D rendering, texturing en animatie in Flash. Met een klein stukje Actionscript 3 code zijn al indrukwekkende visuele 3d animaties te maken.

In deze showcase maken we een muur met 10 verschillende afbeeldingen die stuk voor stuk reageren op een MouseEvent. Voor de basis van deze showcase is de PaperCloud example file gebruikt, die te vinden is in de example directory van de Papervision 3D package.

Hieronder is een Flash animatie te zien die gebruik maakt van de Papervision 3D engine.

  1. package
  2. {
  3. import flash.display.*;
  4. import flash.display.stage.*;
  5. import flash.events.*;
  6. import flash.geom.ColorTransform;
  7. import flash.utils.Dictionary;
  8. import flash.ui.Keyboard;
  9.  
  10. // Import Papervision3D
  11. import org.papervision3d.core.proto.*;
  12. import org.papervision3d.scenes.*;
  13. import org.papervision3d.cameras.*;
  14. import org.papervision3d.objects.*;
  15. import org.papervision3d.materials.*;
  16.  
  17. public class main extends Sprite
  18. {
  19. // ___________________________________________________________________ 3D vars
  20.  
  21. private var container :Sprite;
  22. private var scene :MovieScene3D;
  23. private var camera :Camera3D;
  24.  
  25. private var planeByContainer :Dictionary = new Dictionary();
  26.  
  27.  
  28. // ___________________________________________________________________ Album vars
  29.  
  30. private var paperSize :Number = 0.5;
  31. private var cloudSize :Number = 1500;
  32. private var rotSize :Number = 360;
  33. private var maxAlbums :Number = 60;
  34. private var num :Number = 0;
  35.  
  36.  
  37. // ___________________________________________________________________ stage
  38.  
  39. public var iFull :SimpleButton = new SimpleButton();
  40.  
  41.  
  42. // ___________________________________________________________________ Keyboard vars
  43.  
  44. private var keyRight :Boolean = false;
  45. private var keyLeft :Boolean = false;
  46. private var keyForward :Boolean = false;
  47. private var keyReverse :Boolean = false;
  48.  
  49.  
  50. // ___________________________________________________________________ main
  51.  
  52. public function main()
  53. {
  54. stage.quality = StageQuality.MEDIUM;
  55.  
  56. stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
  57. stage.addEventListener( KeyboardEvent.KEY_UP, keyUpHandler );
  58.  
  59. init3D();
  60.  
  61. addChild( iFull );
  62.  
  63. this.addEventListener( Event.ENTER_FRAME, loop );
  64. }
  65.  
  66.  
  67. // ___________________________________________________________________ Init3D
  68.  
  69. private function init3D():void
  70. {
  71. // Create container sprite and center it in the stage
  72. container = new Sprite();
  73. addChild( container );
  74. container.x = 65;
  75. container.y = 345;
  76.  
  77. // Create scene
  78. scene = new MovieScene3D( container );
  79.  
  80. // Create camera
  81. camera = new Camera3D();
  82. camera.zoom = 5;
  83.  
  84. // Store camera properties
  85. camera.extra =
  86. {
  87. goPosition: new DisplayObject3D(),
  88. goTarget: new DisplayObject3D()
  89. };
  90.  
  91. camera.extra.goPosition.copyPosition( camera );
  92. }
  93.  
  94. // ___________________________________________________________________ Keyboard
  95.  
  96. private function keyDownHandler( event :KeyboardEvent ):void
  97. {
  98. switch( event.keyCode )
  99. {
  100. case "W".charCodeAt():
  101. case Keyboard.UP:
  102. keyForward = true;
  103. keyReverse = false;
  104. break;
  105.  
  106. case "S".charCodeAt():
  107. case Keyboard.DOWN:
  108. keyReverse = true;
  109. keyForward = false;
  110. break;
  111.  
  112. case "A".charCodeAt():
  113. case Keyboard.LEFT:
  114. keyLeft = true;
  115. keyRight = false;
  116. break;
  117.  
  118. case "D".charCodeAt():
  119. case Keyboard.RIGHT:
  120. keyRight = true;
  121. keyLeft = false;
  122. break;
  123. }
  124. trace("keyDownHandler: " + event.keyCode);
  125. }
  126.  
  127.  
  128. private function keyUpHandler( event :KeyboardEvent ):void
  129. {
  130. switch( event.keyCode )
  131. {
  132. case "W".charCodeAt():
  133. case Keyboard.UP:
  134. keyForward = false;
  135. break;
  136.  
  137. case "S".charCodeAt():
  138. case Keyboard.DOWN:
  139. keyReverse = false;
  140. break;
  141.  
  142. case "A".charCodeAt():
  143. case Keyboard.LEFT:
  144. keyLeft = false;
  145. break;
  146.  
  147. case "D".charCodeAt():
  148. case Keyboard.RIGHT:
  149. keyRight = false;
  150. break;
  151. }
  152. trace("keyUpHandler: " + event.keyCode);
  153. }
  154.  
  155. private function metaView():void
  156. {
  157. // Zoom in Out
  158. if( keyForward )
  159. {
  160. // Move camera with the mouse
  161. camera.x = -container.mouseX/4;
  162. camera.y = container.mouseY/3;
  163. }
  164. else if( keyReverse )
  165. {
  166. // Move camera with the mouse
  167. camera.x = -container.mouseX/4;
  168. camera.y = container.mouseY/3;
  169. }
  170.  
  171. // Move left right
  172. if( keyRight )
  173. {
  174. camera.z = -300 + scene.container.mouseX * 5;
  175. camera.y = Math.max( 0, this.mouseY ) * 5;
  176. }
  177. else if( keyLeft )
  178. {
  179. camera.z = -300 + scene.container.mouseX * 5;
  180. camera.y = Math.max( 0, this.mouseY ) * 5;
  181. }
  182. }
  183.  
  184. // ___________________________________________________________________ Create album
  185.  
  186. private function createAlbum()
  187. {
  188. var material:MovieAssetMaterial = new MovieAssetMaterial( "Album" );
  189.  
  190. material.doubleSided = true;
  191. material.lineColor = 0xFFFFFF;
  192.  
  193. material.movie.gotoAndStop( num % material.movie.totalFrames );
  194. material.updateBitmap();
  195.  
  196. var plane :Plane = new Plane( material, paperSize, 0, 2, 2 );
  197.  
  198. // Randomize position
  199. var gotoData :DisplayObject3D = new DisplayObject3D();
  200.  
  201. // Set new .x position
  202. var xFactor :int = num;
  203.  
  204. if(num <= 9) {
  205. gotoData.x = xFactor * 130;
  206. } else if(num == 10) {
  207. xFactor = 0
  208. gotoData.x = xFactor * 130;
  209. gotoData.y = 130;
  210. } else if(num > 10 && num <= 19) {
  211. xFactor = num - 10
  212. gotoData.x = xFactor * 130;
  213. gotoData.y = 130;
  214. } else if(num == 20) {
  215. xFactor = 0
  216. gotoData.x = xFactor * 130;
  217. gotoData.y = 260;
  218. } else if(num > 20 && num <= 29) {
  219. xFactor = num - 20
  220. gotoData.x = xFactor * 130;
  221. gotoData.y = 260;
  222. } else if(num == 30) {
  223. xFactor = 0
  224. gotoData.x = xFactor * 130;
  225. gotoData.y = 390;
  226. } else if(num > 30 && num <= 39) {
  227. xFactor = num - 30
  228. gotoData.x = xFactor * 130;
  229. gotoData.y = 390;
  230. } else if(num == 40) {
  231. xFactor = 0
  232. gotoData.x = xFactor * 130;
  233. gotoData.y = 520;
  234. } else if(num > 40 && num <= 49) {
  235. xFactor = num - 40
  236. gotoData.x = xFactor * 130;
  237. gotoData.y = 520;
  238. } else if(num == 50) {
  239. xFactor = 0
  240. gotoData.x = xFactor * 130;
  241. gotoData.y = 650;
  242. } else if(num > 50 && num <= 59) {
  243. xFactor = num - 50
  244. gotoData.x = xFactor * 130;
  245. gotoData.y = 650;
  246. }
  247.  
  248. plane.extra =
  249. {
  250. goto: gotoData
  251. };
  252.  
  253. // Include in scene
  254. scene.addChild( plane, "Album" + String( num ) );
  255.  
  256. var container:Sprite = plane.container;
  257. container.buttonMode = true;
  258. container.addEventListener( MouseEvent.ROLL_OVER, doRollOver );
  259. container.addEventListener( MouseEvent.ROLL_OUT, doRollOut );
  260. container.addEventListener( MouseEvent.MOUSE_DOWN, doPress );
  261.  
  262. planeByContainer[ container ] = plane;
  263.  
  264. num++;
  265. }
  266.  
  267. // ___________________________________________________________________ Button events
  268.  
  269. private function doPress(event:Event):void
  270. {
  271. var plane:Plane = planeByContainer[ event.target ];
  272.  
  273. var target :DisplayObject3D = new DisplayObject3D();
  274.  
  275. target.copyTransform( plane );
  276. target.moveBackward( 350 );
  277.  
  278. camera.extra.goPosition.copyPosition( target );
  279. camera.extra.goTarget.copyPosition( plane );
  280. };
  281.  
  282.  
  283. private function doRollOver(event:Event):void
  284. {
  285. var plane:Plane = planeByContainer[ event.target ];
  286.  
  287. plane.rotationZ = Math.random() * rotSize;
  288. };
  289.  
  290.  
  291. private function doRollOut(event:Event):void
  292. {
  293.  
  294. };
  295.  
  296.  
  297. // ___________________________________________________________________ Loop
  298.  
  299. private function loop(event:Event):void
  300. {
  301. if( num < maxAlbums )
  302. createAlbum();
  303.  
  304. update3D();
  305.  
  306. iFull.x = 640 + (stage.stageWidth - 640)/2;
  307. iFull.y = 480 + (stage.stageHeight - 480)/2;
  308.  
  309. // Show model in meta view
  310. metaView();
  311. }
  312.  
  313.  
  314. private function update3D():void
  315. {
  316. var target :DisplayObject3D = camera.target;
  317. var goPosition :DisplayObject3D = camera.extra.goPosition;
  318. var goTarget :DisplayObject3D = camera.extra.goTarget;
  319.  
  320. camera.x -= (camera.x - goPosition.x) /32;
  321. camera.y -= (camera.y - goPosition.y) /32;
  322. camera.z -= (camera.z - goPosition.z) /32;
  323.  
  324. target.x -= (target.x - goTarget.x) /32;
  325. target.y -= (target.y - goTarget.y) /32;
  326. target.z -= (target.z - goTarget.z) /32;
  327.  
  328. var paper :DisplayObject3D;
  329.  
  330. for( var i:Number=0; paper = scene.getChildByName( "Album"+i ); i++ )
  331. {
  332. var goto :DisplayObject3D = paper.extra.goto;
  333.  
  334. paper.x -= (paper.x - goto.x) / 32;
  335. paper.y -= (paper.y - goto.y) / 32;
  336. paper.z -= (paper.z - goto.z) / 32;
  337.  
  338. paper.rotationX -= (paper.rotationX - goto.rotationX) /32;
  339. paper.rotationY -= (paper.rotationY - goto.rotationY) /32;
  340. paper.rotationZ -= (paper.rotationZ - goto.rotationZ) /32;
  341. }
  342.  
  343. // Render
  344. scene.renderCamera( this.camera );
  345. }
  346. }
  347. }