package { import org.papervision3d.objects.*; import org.papervision3d.objects.primitives.*; import org.papervision3d.view.* import org.papervision3d.cameras.*; import org.papervision3d.materials.* import flash.events.*; import flash.display.*; public class World extends BasicView { static private const CAMERA_DISTANCE:int = 40000; static private const CAMERA_SPEED:Number = .1; private var move:Boolean = false; private var lastMouseX:Number; private var lastMouseY:Number; private var lastPanAngle:Number; private var lastTiltAngle:Number; private var panAngle:Number = 0; private var tiltAngle:Number = 0; private var olds:Array = []; public function World() { super(0, 0, true, false, CameraType.TARGET); camera.zoom = 20; camera.focus = 2000; camera.z = CAMERA_DISTANCE; addEventListener(Event.ADDED_TO_STAGE, function():void { stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp); }); addEventListener(Event.ENTER_FRAME, onEnterFrame); startRendering(); } public function init(vec:Array):void { // refresh while (olds.length) scene.removeChild(olds.pop()); //Add some reference objects for (var i:int = 0; i < vec.length; i++) { var mat:BitmapMaterial = new BitmapMaterial(vec[i], true); var bmpData:BitmapData = BitmapData(vec[i]); var scale:Number = 1; if (bmpData.width > 400) scale = 400 / bmpData.width; mat.doubleSided = true; var obj:DisplayObject3D = scene.addChild(new Plane(mat, bmpData.width * scale, bmpData.height * scale)); obj.z = - 100 * (i - vec.length / 2); obj.rotationY = 180; olds.push(obj) if (i == 0) continue; obj.useOwnContainer = true; obj.blendMode = BlendMode.SCREEN; } } private function onEnterFrame(e:Event):void { if (move) { panAngle += ((mouseX - lastMouseX) / stage.stageWidth * 180 + lastPanAngle - panAngle) * CAMERA_SPEED; tiltAngle += ((mouseY - lastMouseY) / stage.stageHeight * 180 + lastTiltAngle - tiltAngle) * CAMERA_SPEED; } else { panAngle += (0 - panAngle) * CAMERA_SPEED; tiltAngle += (0 - tiltAngle) * CAMERA_SPEED; } camera.x = Math.sin(panAngle * Math.PI / 180) * CAMERA_DISTANCE; camera.z = Math.cos(panAngle * Math.PI / 180) * CAMERA_DISTANCE; camera.y = Math.sin(tiltAngle * Math.PI / 180) * CAMERA_DISTANCE; } private function mouseDown(event:MouseEvent):void { lastPanAngle = panAngle; lastTiltAngle = tiltAngle; lastMouseX = mouseX; lastMouseY = mouseY; move = true; } private function mouseUp(event:MouseEvent):void { move = false; } } }