用PV3D在Flex中实现全景360

来源:互联网 发布:linux 刻录光盘 编辑:程序博客网 时间:2024/06/06 03:31

http://blog.csdn.net/sunqunsunqun/article/details/7168648#comments

PV3D采用的是左手坐标系,默认的X正向指向屏幕右侧,Y正向指向屏幕上方,Z正向垂直屏幕向内,下图左侧为左手坐标系,用户默认的观察视角是沿着Z轴的负半轴方向。


将实景360场景封装为一个类,代码如下:

[java] view plaincopy
  1. package  
  2. {  
  3.     import flash.display.Sprite;  
  4.     import flash.events.Event;  
  5.     import flash.events.MouseEvent;  
  6.       
  7.     import mx.controls.Alert;  
  8.       
  9.     import org.papervision3d.cameras.Camera3D;  
  10.     import org.papervision3d.materials.BitmapFileMaterial;  
  11.     import org.papervision3d.materials.utils.BitmapMaterialTools;  
  12.     import org.papervision3d.objects.primitives.Cylinder;  
  13.     import org.papervision3d.objects.primitives.Sphere;  
  14.     import org.papervision3d.render.BasicRenderEngine;  
  15.     import org.papervision3d.scenes.Scene3D;  
  16.     import org.papervision3d.view.Viewport3D;  
  17.       
  18.       
  19.     public class MyPV3D extends Sprite  
  20.     {  
  21.         private var sphere:Sphere;  
  22.         private var myMouseDown:Boolean = false;  
  23.         private var viewport:Viewport3D;  
  24.         private var scene:Scene3D;  
  25.         private var camera:Camera3D;  
  26.         private var render:BasicRenderEngine;  
  27.           
  28.         private var bMouseMove:Boolean = false;  
  29.         private var OldMouseX:Number = -1;  
  30.         private var OldMouseY:Number = -1;  
  31.           
  32.         public function MyPV3D(str:String)  
  33.         {  
  34.             super();  
  35.             init(str);  
  36.         }             
  37.           
  38.         private function init(str:String):void  
  39.         {  
  40.             initObj(str);  
  41.               
  42.             //注册帧频侦听用于不断刷新屏幕,每出现一帧就触发该事件  
  43.             addEventListener(Event.ENTER_FRAME,onEnterFrame);  
  44.               
  45.             addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);  
  46.             addEventListener(MouseEvent.MOUSE_UP, onMouseUp);  
  47.             //addEventListener(MouseEvent.ROLL_OVER, onMouseUp);              
  48.             addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);  
  49.             addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel);  
  50.         }  
  51.           
  52.         private function initObj(str:String):void  
  53.         {  
  54.             viewport=new Viewport3D(700,500);  
  55.             addChild(viewport);  
  56.             scene = new Scene3D();  
  57.             camera = new Camera3D();  
  58.             render=new BasicRenderEngine();  
  59.               
  60.               
  61.             var material:BitmapFileMaterial=new BitmapFileMaterial(str);    
  62.               
  63.             //PV3D默认情况下不显示背面,doubleSided属性应设为true  
  64.             material.doubleSided = true;  
  65.             material.opposite = false;  
  66.             material.smooth = true;  
  67.               
  68.             //实例化球体   
  69.             sphere=new Sphere(material,200,50,50);  
  70.             sphere.scaleX = sphere.scaleX*(-1);  
  71.             scene.addChild(sphere);  
  72.               
  73.             //把摄像机移到中心位置,PV3D摄像机的默认位置是camera.z=-1000  
  74.             camera.z=0;  
  75.             //摄象机的缩放参数,  
  76.             camera.zoom=.8;  
  77.             //摄象机的焦距  
  78.             camera.focus=300;  
  79.             render.renderScene(scene, camera, viewport);  
  80.             //this.useHandCursor = true;显示为手型  
  81.             //this.buttonMode = true;  
  82.         }  
  83.           
  84.         private function onEnterFrame(e:Event):void  
  85.         {     
  86.             render.renderScene(scene, camera, viewport);  
  87.         }  
  88.           
  89.         private function onMouseDown(event:MouseEvent):void  
  90.         {  
  91.             myMouseDown = true;  
  92.             this.OldMouseX = this.mouseX;  
  93.             this.OldMouseY = this.mouseY;  
  94.               
  95.         }  
  96.           
  97.           
  98.         private function onMouseUp(event:MouseEvent):void  
  99.         {  
  100.             myMouseDown = false;  
  101.             this.OldMouseX = -1;  
  102.             this.OldMouseY = -1;  
  103.         }  
  104.           
  105.         private function onMouseMove(event:MouseEvent):void  
  106.         {  
  107.             if(myMouseDown)  
  108.             {                 
  109.                 if(this.OldMouseX < 0 || this.OldMouseY < 0 )  
  110.                 {  
  111.                     this.OldMouseX = this.mouseX;  
  112.                     this.OldMouseY = this.mouseY;  
  113.                 }  
  114.                 else  
  115.                 {  
  116.                     var DeltaX:Number = this.mouseX - this.OldMouseX;  
  117.                     var DeltaY:Number = this.mouseY - this.OldMouseY;  
  118.                     camera.rotationY += DeltaX*0.5;  
  119.                     camera.rotationX += DeltaY*0.5;  
  120.                       
  121.                     if (camera.rotationX <= -90)  
  122.                     {  
  123.                         camera.rotationX = -90;  
  124.                     }  
  125.                     else if (camera.rotationX >= 90)  
  126.                     {  
  127.                         camera.rotationX = 90;  
  128.                     }  
  129.                     render.renderScene(scene, camera, viewport);  
  130.                     this.OldMouseX = this.mouseX;  
  131.                     this.OldMouseY = this.mouseY;  
  132.                 }                 
  133.             }  
  134.         }  
  135.           
  136.         private function onMouseWheel(event:MouseEvent):void  
  137.         {  
  138.             if(event.delta > 0)  
  139.             {  
  140.                 if(camera.zoom > 0.6)  
  141.                 {  
  142.                     camera.zoom *= 0.95;  
  143.                 }  
  144.             }  
  145.             else if(event.delta < 0)  
  146.             {  
  147.                 camera.zoom *= 1.05;  
  148.             }  
  149.         }  
  150.           
  151.     }  
  152. }  

然后在一个Flex程序中使用该全景类,如下图所示:

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   
  3.                xmlns:s="library://ns.adobe.com/flex/spark"   
  4.                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"  
  5.                creationComplete="App_creationCompleteHandler(event)" >  
  6.     <fx:Script>  
  7.         <![CDATA[  
  8.             import mx.core.UIComponent;  
  9.             import mx.events.FlexEvent;  
  10.               
  11.             protected function App_creationCompleteHandler(event:FlexEvent):void  
  12.             {  
  13.                 // TODO Auto-generated method stub  
  14.                 this.CreatePV3D();  
  15.                   
  16.             }  
  17.               
  18.             private function CreatePV3D():void  
  19.             {  
  20.                 var Path:String = "../Images/pv3d.jpg";  
  21.                 var iPV3D:MyPV3D = new MyPV3D(Path);  
  22.                 var iUI:UIComponent = new UIComponent();  
  23.                 iUI.addChild(iPV3D);  
  24.                 iCanvas.addChild(iUI);  
  25.             }  
  26.               
  27.         ]]>  
  28.     </fx:Script>  
  29.     <fx:Declarations>  
  30.         <!-- 将非可视元素(例如服务、值对象)放在此处 -->  
  31.     </fx:Declarations>  
  32.     <mx:Canvas id="iCanvas" width="700" height="500"/>  
  33. </s:Application>