Papervison3D 及其学习代码

55 篇文章 0 订阅
28 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值