package { import flash.display.DisplayObject; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.objects.primitives.Cube; public class FPWare extends Ancestor { private var frontMaterial:BitmapFileMaterial = new BitmapFileMaterial("lhside.jpg"); private var backMaterial:BitmapFileMaterial = new BitmapFileMaterial("rhside.jpg"); private var leftMaterial:BitmapFileMaterial = new BitmapFileMaterial("front.jpg"); private var rightMaterial:BitmapFileMaterial = new BitmapFileMaterial("back.jpg"); private var topMaterial:BitmapFileMaterial = new BitmapFileMaterial("top.jpg"); private var bottomMaterial:BitmapFileMaterial = new BitmapFileMaterial("top.jpg"); private var targetrotationX:Number = 0; private var targetrotationY:Number = 0; private var targetrotationZ:Number = 0; private var tweening:Boolean = false; private var cube:Cube; public function FPWare() { init(1100, 350); } override protected function init3d():void { frontMaterial.interactive = true; frontMaterial.name = "front"; backMaterial.interactive = true; backMaterial.name = "back"; leftMaterial.interactive = true; leftMaterial.name = "left"; rightMaterial.interactive = true; rightMaterial.name = "right"; topMaterial.interactive = true; topMaterial.name = "top"; bottomMaterial.interactive = true; bottomMaterial.name = "bottom"; cube = new Cube(new MaterialsList( { front: frontMaterial, back: backMaterial, left: leftMaterial, right: rightMaterial, top: topMaterial, bottom: bottomMaterial } ), 140, 400, 500, 6, 6, 6); // Listen for the click: cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, clickedMe); // Add to scene: default_scene.addChild(cube); cube.scale = 1.5; cube.x = 500; } private function clickedMe( e:InteractiveScene3DEvent):void { if (tweening) { tweening = false; } else { switch(e.face3d.material.name) { case "front": targetrotationX = 0; targetrotationY = 180; targetrotationZ = 0; tweening = true; break; case "back": targetrotationX = 0; targetrotationY = 0; targetrotationZ = 0; tweening = true; break; case "left": targetrotationX = 0; targetrotationY = -90; targetrotationZ = 0; tweening = true; break; case "right": targetrotationX = 0; targetrotationY = 90; targetrotationZ = 0; tweening = true; break; case "top": targetrotationX = 90; targetrotationY = 0; targetrotationZ = 0; tweening = true; break; case "bottom": targetrotationX = -90; targetrotationY = 0; targetrotationZ = 180; tweening = true; break; } } } override protected function processFrame():void { if (tweening) { if (default_camera.zoom<8) { default_camera.zoom += Math.sqrt(22-default_camera.zoom)/10; } if (cube.rotationX < targetrotationX) { cube.rotationX += Math.sqrt(targetrotationX-cube.rotationX); cube.rotationX = Math.round(cube.rotationX); }else if (cube.rotationX > targetrotationX) { cube.rotationX -= Math.sqrt(cube.rotationX-targetrotationX); cube.rotationX = Math.round(cube.rotationX); } // Y axis: if (cube.rotationY < targetrotationY) { cube.rotationY += Math.sqrt(targetrotationY-cube.rotationY); cube.rotationY = Math.round(cube.rotationY); }else if (cube.rotationY > targetrotationY) { cube.rotationY -= Math.sqrt(cube.rotationY-targetrotationY); cube.rotationY = Math.round(cube.rotationY); } // Z axis: if (cube.rotationZ < targetrotationZ) { cube.rotationZ += Math.sqrt(targetrotationZ-cube.rotationZ); cube.rotationZ = Math.round(cube.rotationZ); }else if (cube.rotationZ > targetrotationZ) { cube.rotationZ -= Math.sqrt(cube.rotationZ-targetrotationZ); cube.rotationZ = Math.round(cube.rotationZ); } } else { if (default_camera.zoom > 200) { default_camera.zoom -= Math.sqrt(default_camera.zoom)*5; } cube.rotationX += 2; cube.rotationY += 2; if (cube.rotationX >= 360) cube.rotationX = 0; if (cube.rotationY >= 360) cube.rotationY = 0; } } } }