package { import alternativa.engine3d.core.Object3D; import alternativa.engine3d.materials.TextureMaterial; import alternativa.engine3d.resources.BitmapTextureResource; import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Matrix; import flash.geom.Vector3D; import org.libspark.alternativa3d.view.AlternativaTemplate; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.Expo; import org.libspark.betweenas3.tweens.ITween; [SWF(frameRate = "60")] public class MolehillMotionLite extends AlternativaTemplate { //---------------------------------------------------------- // // Static Property // //---------------------------------------------------------- // 分割数です 2累乗に設定する必要があります private static const MAX_CELL_W:uint = 16; private static const MAX_CELL_H:uint = 16; //---------------------------------------------------------- // // Constructor // //---------------------------------------------------------- public function MolehillMotionLite() { super(0, 0, true, 0x000000, 1, 4); } //---------------------------------------------------------- // // Property // //---------------------------------------------------------- public var dummyCamera:Vector3D; [Embed(source = 'assets/image.jpg')] private var BitmapImage:Class; // 細切れになった写真の3Dパーツを保存する配列です private var planeArr:Array /* type of Array */ = []; //---------------------------------------------------------- // // Function // //---------------------------------------------------------- override protected function atInit():void { // 画像を分割キャプチャします var bitmap:Bitmap = new BitmapImage(); var bmpDataArr:Array /* type of BitmapData */ = []; // 二重ループを開始します var i:int = 0; var j:int = 0; for (i = 0; i < MAX_CELL_W; i++) { for (j = 0; j < MAX_CELL_H; j++) { var bmpData:BitmapData = new BitmapData(bitmap.width / MAX_CELL_W, bitmap.height / MAX_CELL_H, false, 0xFF000000); // 行列を用いてキャプチャする画像の原点をずらします var matrix:Matrix = new Matrix(); matrix.translate(-bitmap.width / MAX_CELL_W * i, -bitmap.height / MAX_CELL_H * j); //  行列変換を用いてキャプチャします bmpData.draw(bitmap, matrix); bmpDataArr.push(bmpData); } } // 分割平面を作成します var wrap:Object3D = scene.addChild(new Object3D()); wrap.x = -bitmap.width / 2 >> 0; wrap.z = -bitmap.height / 2 >> 0; for (i = 0; i < MAX_CELL_W; i++) { planeArr[i] /* type of Plane */ = []; for (j = MAX_CELL_H; j > 0; j--) { var resource:BitmapTextureResource = new BitmapTextureResource(BitmapData(bmpDataArr.shift())); var material:TextureMaterial = new TextureMaterial(resource); var plane:Plane = new Plane(bitmap.width / MAX_CELL_W >> 0, bitmap.height / MAX_CELL_H >> 0, 1, 1, true, material); plane.x = (bitmap.width / MAX_CELL_W) * i >> 0; plane.z = (bitmap.height / MAX_CELL_H) * j >> 0; plane.rotationX = Math.PI / 2; plane.setMaterialToAllSurfaces(material); planeArr[i][j] = wrap.addChild(plane); } } // レンダリングを開始します motion(); // スタッツ表示 addChild(camera.diagram); } override protected function atPreRender():void { cameraController.setObjectPosXYZ(dummyCamera.x, dummyCamera.y, dummyCamera.z); cameraController.lookAtXYZ(0, 0, 0); } /** * モーションのメソッドです */ private function motion():void { var totalTween:ITween; // 二重ループを開始します var i:int = 0; var j:int = 0; var tweenArr:Array = []; // 分割平面のモーションを設定します for (i = 0; i < planeArr.length; i++) { for (j = 1; j < planeArr[i].length; j++) { var plane:Plane = Plane(planeArr[i][j]); plane.y = -5000; plane.rotationZ = Math.PI * 2; var distance:Number = Math.sqrt(i * i + j * j); tweenArr.push(BetweenAS3.delay(BetweenAS3.to(plane, { y: 0 }, 1.5, Expo.easeOut), distance * .08)); tweenArr.push(BetweenAS3.delay(BetweenAS3.to(plane, { rotationZ: 0 }, 1.3, Expo.easeOut), distance * .025 + 1.45 )); } } // カメラのモーションを設定します dummyCamera = new Vector3D(800, -3000, 800); tweenArr.push(BetweenAS3.to(dummyCamera, { x: 0, y: -490, z: 0 }, 3, Expo.easeInOut)); totalTween = BetweenAS3.parallelTweens(tweenArr); totalTween = BetweenAS3.delay(totalTween, 0, 1.5); // モーション後の遅延を追加 totalTween.stopOnComplete = false; totalTween.play(); } } }