Panorama

Papervision3D Panorama

Code

Δ

package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.ui.ContextMenu;

  import org.papervision3d.cameras.Camera3D;
  import org.papervision3d.materials.BitmapMaterial;
  import org.papervision3d.objects.primitives.Sphere;
  import org.papervision3d.render.BasicRenderEngine;
  import org.papervision3d.scenes.Scene3D;
  import org.papervision3d.view.Viewport3D;

  public class Papervision3DPanorama extends Sprite
  {
    [Embed(source="Panorama.jpg")]
    private var Asset :Class;

    private var scene    :Scene3D;
    private var camera   :Camera3D;
    private var viewport :Viewport3D;
    private var renderer :BasicRenderEngine;

    public function Papervision3DPanorama()
    {
      var menu :ContextMenu = new ContextMenu();
      menu.hideBuiltInItems();
      contextMenu = menu;

      scene = new Scene3D();

      camera           = new Camera3D();
      camera.focus     = 300;
      camera.rotationY = 30;
      camera.zoom      = 2;

      viewport                  = new Viewport3D();
      viewport.autoScaleToStage = true;
      addChild(viewport);

      renderer = new BasicRenderEngine();

      var material :BitmapMaterial = new BitmapMaterial(new Asset().bitmapData);
      material.opposite = true;
      material.smooth   = true;

      var object :Sphere = new Sphere(material, 30000, 30, 30);
      scene.addChild(object);

      addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
      addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
      addEventListener(MouseEvent.MOUSE_OUT, handleMouseOut);

      stage.addEventListener(Event.RESIZE, handleResize);

      render();
    }

    private function handleEnterFrame(e:Event):void
    {
      camera.rotationX += (mouseY - (stage.height * 0.5)) * 0.02;
      camera.rotationY += (mouseX - (stage.width  * 0.5)) * 0.02;

      if (camera.rotationX <= -90) {
        camera.rotationX = -90;
      } else if (camera.rotationX >= 90) {
        camera.rotationX = 90;
      }

      render();
    }

    private function handleResize(e:Event):void
    {
      render();
    }

    private function handleMouseDown(e:MouseEvent):void
    {
      addEventListener(Event.ENTER_FRAME, handleEnterFrame);
    }

    private function handleMouseUp(e:MouseEvent):void
    {
      removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
    }

    private function handleMouseOut(e:MouseEvent):void
    {
      removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
    }

    private function render():void
    {
      renderer.renderScene(scene, camera, viewport);
    }
  }
}

Download