本人在做项目的时候,用到pv3D在GIS中的应用。所以就简单的总结下一共大家参考:
1、初始化加载函数,在初始化函数中增加监听,将相应的事件加入舞台。this.addEventListener(Event.ADDED_TO_STAGE,函数名)
2、在监听事件中监听鼠标下按、抬起、移动事件、和初始化PV3D。
3、创建PV3D,创建时候要注意四个参数。即viewport创建视图、scene3D场景、camera3D相机、basic render engine渲染器
4、具体操作如下:源代码(可直接运行)
代码:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
????? xmlns:s="library://ns.adobe.com/flex/spark"
????? xmlns:mx="library://ns.adobe.com/flex/mx"
????? xmlns:supportClasses="com.esri.ags.skins.supportClasses.*"
????? xmlns:iframe="http://code.google.com/p/flex-iframe/"
????? minWidth="955" minHeight="600"
????? initialize="init()">
?<s:layout>
??<supportClasses:AttachmentLayout/>
?</s:layout>
?<fx:Declarations>
??<!-- 将非可视元素(例如服务、值对象)放在此处 -->
??<s:WebService id="webserverId" showBusyCursor="true" fault="faultHandler(event)">
???<s:operation name="getImage" result="getImageHandler(event)"/>
??</s:WebService>
??<s:HTTPService id="HTTPSerId" useProxy="false" resultFormat="xml" url="config.xml" result="getResult(event)">
???
??</s:HTTPService>
?</fx:Declarations>
?
?<fx:Style>
??@namespace s "library://ns.adobe.com/flex/spark";
??@namespace mx "library://ns.adobe.com/flex/mx";
??@namespace supportClasses "com.esri.ags.skins.supportClasses.*";
??@namespace iframe "http://code.google.com/p/flex-iframe/";
??
??mx|ToolTip{
???fontFamily:"Arial";
???fontSize:15;
???fontStyle:"italic";
???color:#ffffff;
???backgroundColor:#3D59AB;
???alpha:1;
??}
?</fx:Style>
?<fx:Script>
??<![CDATA[
???import mx.controls.Alert;
???import mx.rpc.events.FaultEvent;
???import mx.rpc.events.ResultEvent;
???
???import org.papervision3d.cameras.Camera3D;
???import org.papervision3d.core.math.Sphere3D;
???import org.papervision3d.core.utils.Mouse3D;
???import org.papervision3d.events.FileLoadEvent;
???import org.papervision3d.materials.BitmapFileMaterial;
???import org.papervision3d.objects.primitives.Sphere;
???import org.papervision3d.render.BasicRenderEngine;
???import org.papervision3d.scenes.Scene3D;
???import org.papervision3d.view.Viewport3D;
???
???private var viewPort:Viewport3D;
???private var scene:Scene3D;
???private var camera:Camera3D;
???private var render:BasicRenderEngine;
???private var bmp:BitmapFileMaterial;
???private var imgPath:String="images/Pano360/pan(0).jpg";
???private var sphere:Sphere;
???private var mouse3D:Mouse3D;
???private var previousMouseX:Number;
???private var previousMouseY:Number;
???private var isOrbit:Boolean;
???private var camPitch:Number=0;
???private var camYaw:Number=90;
???private var camZ:Number=0;
???private var isFull:Boolean;
???private var imgName:String;
???private var distincate:Number;
???private var angled:Number;
???
???[Bindable]??
???private var xml:XML;
???private var xmlResult:XMLList;?
???private function getResult(event:ResultEvent):void
???{
???}
???private function getImageHandler(e:ResultEvent):void
???{
???}
???private function faultHandler(event:FaultEvent):void
???{
????Alert.show(event.fault.toString(),"WebServer error");
???}
???private function init():void
???{
????HTTPSerId.send();
????this.addEventListener(Event.ADDED_TO_STAGE,addToStage);
????
???}
???private function addToStage(e:Event):void
???{
????iniPaperVision3D(1000,600);
????this.UIComId.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
????stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
????stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
????stage.addEventListener(MouseEvent.DOUBLE_CLICK,onDoubleClick);
???}
???private function onMouseDown(e:MouseEvent):void
???{
????isOrbit=true;
????previousMouseX=e.stageX;
????previousMouseY=e.stageY;
???}
???private function onMouseMove(e:MouseEvent):void
???{
????var diffMouseX:Number=e.stageX-previousMouseX;
????var diffMouseY:Number=e.stageY-previousMouseY;
????
????if(isOrbit)
????{
?????camPitch+=diffMouseY;
?????camYaw+=diffMouseX;
?????previousMouseX=e.stageX;
?????previousMouseY=e.stageY;
????}
???}
???private function onMouseUp(e:MouseEvent):void
???{
????isOrbit=false;
???}
???private function onDoubleClick(e:MouseEvent):void
???{
????stage.addEventListener(FullScreenEvent.FULL_SCREEN,getFullScreen);
????stage.displayState=StageDisplayState.FULL_SCREEN;
???}
???private function getFullScreen(e:FullScreenEvent):void
???{
????if(e.fullScreen)
????{
?????UIComId.removeChild(viewPort);
?????cavId.removeAllElements();
?????iniPaperVision3D(1700,1440);
?????isFull=true;
????}
????else
????{
?????UIComId.removeChild(viewPort);
?????cavId.removeAllElements();
?????iniPaperVision3D(880,300);
?????cavId.addChild(lkbIdNext);
?????cavId.addChild(lkbIdBack);
?????cavId.addChild(btn_full);
????}
???}
???private function iniPaperVision3D(width:Number,hight:Number):void
???{
????viewPort=new Viewport3D(width,hight); //观察区
????viewPort.interactive=true;
????scene=new Scene3D();//场景
????camera=new Camera3D();//定义相机
????render=new BasicRenderEngine();//定义渲染器
????
????UIComId.addChild(viewPort);
????cavId.addElement(UIComId);
????
????bmp=new BitmapFileMaterial(imgPath);
????bmp.interactive=true;
????bmp.doubleSided=true;
????bmp.smooth=true;
????bmp.tiled=true;
????bmp.addEventListener(FileLoadEvent.LOAD_COMPLETE,loadImgLoad);
???}
???private function loadImgLoad(e:FileLoadEvent):void
???{
????startImgRender();
???}
???private function startImgRender():void
???{
????sphere=new Sphere(bmp,68,30,30);
????sphere.scaleX=3;
????sphere.scaleY=3;
????sphere.scaleZ=-3;
????sphere.x=0;
????sphere.y=0;
????sphere.z=0;
????sphere.localRotationY=180;
????
????scene.addChild(sphere);
????
????Mouse3D.enabled=true;
????mouse3D=viewPort.interactiveSceneManager.mouse3D;
????mouse3D.calculateScreenCoords(camera);
????mouse3D.autoCalcScreenCoords=true;
????
????camera.x=0;
????camera.y=0;
????camera.z=0;
????camera.focus=11;
????distincate = 0;
????angled = 0;
????
????render.renderScene(scene,camera,viewPort);
????//keyBoardUpAndDown();
????initEvents(); //事件侦听???
???}
????private? function initEvents():void
???{
????addEventListener(Event.ENTER_FRAME,onEnterFrame);
???}
???protected function onEnterFrame( ThisEvent:Event ):void
???{
?????camera.rotationX = camPitch;
????camera.rotationY = camYaw;?
????camera.rotationZ = camZ;
????render.renderScene(scene,viewPort);
???}
???//与键盘上的键相关联
???private function keyBoardUpAndDown():void
???{????
???}
?
???private function NextClick(direction:String):void
???{
???} ???private function BackClick():void ???{ ???? ???} ??]]> ?</fx:Script> ? ?<mx:Canvas id="cavId" width="900" height="350" borderVisible="false"> ??<mx:UIComponent id="UIComId" toolTip="双击全屏"/> ??????? <mx:LinkButton id="lkbIdNext" x="200" y="300" label="向前" click="NextClick('next')"/> ??<mx:LinkButton id="lkbIdBack" x="340" y="300" label="向后" click="BackClick()"/> ??<s:Button id="btn_full" x="500" y="320" label="测试全屏" click="onDoubleClick(event)" visible="false"/> ?</mx:Canvas> </s:Application>