本人在做项目的时候,用到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, camera, 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>