PaperVision 3D 로 만든 SOAP 연동 3D Map

1.Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" creationComplete="init()" width="669" height="519">
 <mx:states>
  <mx:State name="Loading">
   <mx:AddChild relativeTo="{MainCanvas}" position="lastChild">
    <mx:Canvas x="165.5" y="228" width="338" height="86" backgroundColor="#FFFFFF" backgroundAlpha="0.4">
     <mx:SWFLoader x="19" y="25" source="http://.../assets/loading.swf"/>
    </mx:Canvas>
   </mx:AddChild>
  </mx:State>
 </mx:states>
 <mx:Script>
  <![CDATA[
   import mx.controls.SWFLoader;
   import org.papervision3d.materials.utils.MaterialsList;
   import mx.core.UIComponent;
   import mx.controls.Alert;
   import mx.collections.ArrayCollection;
   import mx.rpc.events.*;
   import mx.rpc.soap.*;
   import mx.utils.ArrayUtil;
 
   import org.papervision3d.cameras.Camera3D;
   import org.papervision3d.core.geom.Lines3D;
   import org.papervision3d.core.geom.renderables.Line3D;
   import org.papervision3d.core.geom.renderables.Vertex3D;
   import org.papervision3d.events.InteractiveScene3DEvent;
   import org.papervision3d.materials.BitmapFileMaterial;
   import org.papervision3d.materials.special.LineMaterial;
   import org.papervision3d.objects.DisplayObject3D;
   import org.papervision3d.objects.primitives.Plane;
   import org.papervision3d.view.BasicView;
   
   import mx.managers.CursorManager;
 
   var m:Main;
   var ServerURL:String = "http://.../axis/";
   var StationArr:Array = new Array();
   var BusArr:Array = new Array();
   var BusCode:String = "";
   var BusType:String = "";
   var Buslines3D:Lines3D;
   var nCode:Number;
   var PosXMIN:Number = 0;
   var PosYMIN:Number = 0;
  
   public function init():void
   {
    CursorManager.setBusyCursor();
    
    m = new Main();
    var tUI:UIComponent = new UIComponent();
    tUI.addChild(m);
    m.compo.camera.zoom = 16;
    
    MainCanvas.addChildAt(tUI,0);
    MainCanvas.addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel);
    MainCanvas.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);  
             MainCanvas.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
             
             m.compo.viewport.containerSprite.x = 1000;
             PosXMIN = 177371 + 22000;
    PosYMIN = 468477 - 20000;
   
             BusCode = ExternalInterface.call("call");
             //Test용
             //BusCode = '3014000|0';
             //Test용
             var tArr:Array = BusCode.split("|");
             BusCode = tArr[0];
    BusType = tArr[1];
    
    if (BusCode != null && BusCode != '')
    {
     getBusData(BusCode);
       }
       else
       {
        CursorManager.removeBusyCursor();
       }
   }
   
   public function getBusData(Code:String):void
      {
       currentState = 'Loading';
       nCode = Number(Code);
       getBusLineDataByBusCode(nCode);
      }
      private function faultevent(e:FaultEvent):void
   {
    //Alert.show(e.message.toString());
   }
   /*Common Function*/
   /*Communication*/
   public function getBusStopDataByBusCode(BusCode:Number):void
   {
    var gateway:WebService = new WebService();
    
    gateway.wsdl = ServerURL + "Soap_RtofStn_Qry.jws?wsdl";
     gateway.loadWSDL();
     gateway.getRtofStnQry.addEventListener(ResultEvent.RESULT, getRtofStnQry_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getRtofStnQry("",BusCode);
   }
   public function getBusLineDataByBusCode(BusCode:Number):void
   {
    var gateway:WebService = new WebService();
    
    gateway.wsdl = ServerURL + "Soap_RtofPline_Qry.jws?wsdl";
     gateway.loadWSDL();
     gateway.getRtofPlineQry.addEventListener(ResultEvent.RESULT, getRtofPlineQry_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getRtofPlineQry("",BusCode);
   }
   public function getBusLocationDataByBusCode(BusCode:Number):void
   {
    var gateway:WebService = new WebService();
    
    gateway.wsdl = ServerURL + "Soap_BusLoct_Qry.jws?wsdl";
     gateway.loadWSDL();
     gateway.getBusLoctQry.addEventListener(ResultEvent.RESULT, getBusLoctQry_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getBusLoctQry("",BusCode);
   }
   public function getInfoStation(routeid:String,ord:String,uniqueId:String):void
   {
    var gateway:WebService = new WebService();
    
    gateway.wsdl = ServerURL + "Soap_StnArr_Qry.jws?wsdl";
     gateway.loadWSDL();
     
     /*
     gateway.getStnArrQry.addEventListener(ResultEvent.RESULT, getInfoStation_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getStnArrQry("",routeid,ord);
    */
    gateway.getStnArrQry.addEventListener(ResultEvent.RESULT, getInfoStation_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getStnArrQry("",routeid,ord);
   }
   public function getInfoBus(busid:String):void
   {
    var gateway:WebService = new WebService();
    
    gateway.wsdl = ServerURL + "Soap_BusElsp_Qry.jws?wsdl";
     gateway.loadWSDL();
     
     gateway.getBusElspQry.addEventListener(ResultEvent.RESULT, getInfoBus_Result);
     gateway.addEventListener(FaultEvent.FAULT, faultevent);
    gateway.getBusElspQry("",busid);
   }
   
   var MsgString:String;
   import mx.controls.Alert;
   private function getInfoStation_Result(e:ResultEvent):void
   {
    try
    {
     var table:ArrayCollection;
     var recordAC:ArrayCollection;
     recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
     
     
     MsgString = recordAC[0][0].STNAME + " (" + tUniqueId +")\n" + recordAC[0][0].ROUTENAME + "번 " + recordAC[0][0].STNAME +"\n";
     
     if (recordAC[0][0].LEFT != '' && recordAC[0][0].LEFT != null)
     {
      if (recordAC[0][0].LEFT == "0" || recordAC[0][0].LEFT == "1")
      {
       MsgString = MsgString + "첫번째 버스 전 정류소 ["+recordAC[0][0].STNAME1 +"]앞을 출발하였습니다.\n";
      }
      else
      {
       MsgString = MsgString + "첫번째 버스 "+recordAC[0][0].LEFT+"번째 전 정류소 ["+recordAC[0][0].STNAME1+"] "+recordAC[0][0].TRAVELTIME+"분후 도착예정\n";
      }
     }
     
     if (recordAC[0][0].LEFT2 != '' && recordAC[0][0].LEFT2 != null)
     {
      if (recordAC[0][0].LEFT2 == "0" || recordAC[0][0].LEFT2 == "1")
      {
       MsgString = MsgString + "두번째 버스 전 정류소 ["+recordAC[0][0].STNAME2 +"]앞을 출발하였습니다.\n";
      }
      else
      {
       MsgString = MsgString + "첫번째 버스 "+recordAC[0][0].LEFT2+"번째 전 정류소 ["+recordAC[0][0].STNAME2+"] "+recordAC[0][0].TRAVELTIME2+"분후 도착예정\n";
      }
     }
     MsgString = MsgString + "막차시간 : "+recordAC[0][0].LASTTIME+"\n";
     
     var gateway:WebService = new WebService();
     
     gateway.wsdl = ServerURL + "Soap_StnofRt_Qry.jws?wsdl";
      gateway.loadWSDL();
      
      gateway.getStnofRtQry.addEventListener(ResultEvent.RESULT, getInfoStationLast_Result);
      gateway.addEventListener(FaultEvent.FAULT, faultevent);
     gateway.getStnofRtQry("",tUniqueId);
     
    }catch(e:Error){}
   }
   var InfoStr:String = "";
   private function getInfoStationLast_Result(e:ResultEvent):void
   {
    try
    {
     var table:ArrayCollection;
     var recordAC:ArrayCollection;
     recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
     
     IdPopupCanvas.visible = true;
     /*
     if (this.mouseX - 80>0)
     {IdPopupCanvas.x = this.mouseX - 80;}
     else
     {IdPopupCanvas.x = 0;}
     
     if (this.mouseY - 160>0)
     {IdPopupCanvas.y = this.mouseY - 160;}
     else
     {IdPopupCanvas.y = 0;}
     */
     MsgString += "경유노선 : " + recordAC[0][0].ROUTENAME;
     //IdPopupCanvas.x = 250;
     //IdPopupCanvas.y = 100;
     IdPopupText.text = MsgString;
    }
    catch(e:Error){}
   }
   
   private function getInfoBus_Result(e:ResultEvent):void
   {
    try
    {
     var table:ArrayCollection;
     var recordAC:ArrayCollection;
     recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
     
     IdPopupCanvas.visible = true;
     /*
     if (this.mouseX - 80>0)
     {IdPopupCanvas.x = this.mouseX - 80;}
     else
     {IdPopupCanvas.x = 0;}
     
     if (this.mouseY - 160>0)
     {IdPopupCanvas.y = this.mouseY - 160;}
     else
     {IdPopupCanvas.y = 0;}
     */
     //IdPopupCanvas.x = 250;
     //IdPopupCanvas.y = 100;
     
     IdPopupText.text = "다음정류소 : 약 " + recordAC[0][0].MAINARRTM + "분 후 도착예정\n종점도착 : 약 " + recordAC[0][0].ENDARRTM + "분 후 도착예정\n진행방향 : "+recordAC[0][0].ARSMENT;
    }
    catch(e:Error){}
   }
   private function getRtofStnQry_Result(e:ResultEvent):void
   {
    var table:ArrayCollection;
    var recordAC:ArrayCollection;
    recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
    
    try
    {
     for (var i:Number=0; i<10000;i++)
     {
      var ObjR:Object = new Object();
      ObjR.ALIASNM = recordAC[0][i].ALIASNM;
      ObjR.ARSMENT = recordAC[0][i].ARSMENT;
      ObjR.DOWNX = recordAC[0][i].DOWNX;
      ObjR.DOWNY = recordAC[0][i].DOWNY;
      ObjR.ORD = recordAC[0][i].ORD;
      ObjR.ROUTEID = recordAC[0][i].ROUTEID;
      ObjR.ROUTEKIND = recordAC[0][i].ROUTEKIND;
      ObjR.SECTIONID = recordAC[0][i].SECTIONID;
      ObjR.STATIONID = recordAC[0][i].STATIONID;
      ObjR.STATIONNAME = recordAC[0][i].STATIONNAME;
      ObjR.TRNYN = recordAC[0][i].TRNYN;
      ObjR.X = Number(recordAC[0][i].X);
      ObjR.Y = Number(recordAC[0][i].Y);
      ObjR.UNIQUEID = Number(recordAC[0][i].UNIQUEID);
      StationArr.push(ObjR);
     }
    }
    catch(e:Error)
    {}
    
    drawStation();
    
     getBusLocationDataByBusCode(nCode);
   }
   /*Communication*/
   /*Communication Result*/
   var planeGroupBus:DisplayObject3D;
   
   import org.papervision3d.objects.primitives.Cube;
   import org.papervision3d.materials.MovieMaterial;
   public function drawBus():void
   {
    
    planeGroupBus = new DisplayObject3D();
    planeGroupBus.name = "Bus";
    //BusUnique,tUniqueId
    for (var i:Number=0;i<BusArr.length;i++)
    {
     var PosX:Number = (BusArr[i].MATCH_X - PosXMIN)/10;
        var PosY:Number = (BusArr[i].MATCH_Y - PosYMIN)/10;
        
        //var material:BitmapFileMaterial = new BitmapFileMaterial( "http://.../assets/bus_b.png" );        
        var mc:MovieClip;
        mc = bus.content as MovieClip;
        
        var material:MovieMaterial = new MovieMaterial(bus,false,false);
        material.fillColor = 0xF4F4F4;
        material.smooth = true;
        material.fillAlpha = 0;
        material.doubleSided = true;
     material.animated = true;
     material.interactive = true;
/*
     material.doubleSided = true;
     material.smooth = true;
     material.lineAlpha = 0;
     material.lineColor = 0xFFFFFF;
     material.interactive = true;
*/
     
        /*
     var material_f:BitmapFileMaterial = new BitmapFileMaterial( "http://210.96.13.90/.../bus_b_f.png" );
     material_f.doubleSided = true;
     material_f.smooth = true;
     material_f.lineAlpha = 0;
     material_f.lineColor = 0xFFFFFF;
     material_f.interactive = true;
     
     var material_t:BitmapFileMaterial = new BitmapFileMaterial( "http://.../assets/bus_b_t.png" );
     material_t.doubleSided = true;
     material_t.smooth = true;
     material_t.lineAlpha = 0;
     material_t.lineColor = 0xFFFFFF;
     material_t.interactive = true;
     
     var material_b:BitmapFileMaterial = new BitmapFileMaterial( "http://.../assets/bus_b_b.png" );
     material_b.doubleSided = true;
     material_b.smooth = true;
     material_b.lineAlpha = 0;
     material_b.lineColor = 0xFFFFFF;
     material_b.interactive = true;
     
     var material_s:BitmapFileMaterial = new BitmapFileMaterial( "http://.../assets/bus_b_s.png" );
     material_s.doubleSided = true;
     material_s.smooth = true;
     material_s.lineAlpha = 0;
     material_s.lineColor = 0xFFFFFF;
     material_s.interactive = true;
     
     
     var materialsList:MaterialsList = new MaterialsList();
                 materialsList.addMaterial( material_t, "front" );
                 materialsList.addMaterial( material_t, "back" );
                 materialsList.addMaterial( material_s, "left" );
                 materialsList.addMaterial( material_s, "right" );
                 materialsList.addMaterial( material_b, "top" );
                 materialsList.addMaterial( material_f, "bottom" );
*/
     //create plane
     /*if (BusUnique != "" && BusUnique == BusArr[i].BUSID.toString())
     {
      tObjW = 60 * (100/m.compo.camera.zoom);
      tObjH = 60 * (100/m.compo.camera.zoom);
     }
     else
     {*/
     tObjW = 30 * (100/m.compo.camera.zoom);
     tObjH = 30 * (100/m.compo.camera.zoom);
     //}
     
     /*******3D Version********/
     /*
     var cube:Cube =new  Cube(materialsList, tObjW, tObjH, tObjH, 3, 3, 3);
     cube.x = PosX - m.compo.moveX;
     cube.y = PosY + m.compo.moveY;
     cube.rotationX = m.compo.camera.x;
     cube.rotationY = m.compo.camera.y;
     cube.name = BusArr[i].BUSID + "_" + PosX.toString() + "_" + PosY.toString() ;
     
     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, bus_press);
     planeGroupBus.addChild(cube);
     */
     /*******3D Version********/
     
     var plane:Plane = new Plane( material, tObjW, tObjH, 1, 1);
     plane.x = PosX - m.compo.moveX;
     plane.y = PosY + m.compo.moveY;
     plane.name = BusArr[i].BUSID + "_" + PosX.toString() + "_" + PosY.toString() ;
     
     plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, bus_press);
     planeGroupBus.addChild(plane);
     
     
     }
     BusUnique = "";
     m.compo.scene.addChild( planeGroupBus );
   }
   var planeGroup:DisplayObject3D;
   public function drawStation():void
   {
    planeGroup = new DisplayObject3D();
    planeGroup.name = "Station";
    
    for (var i:Number=0;i<StationArr.length;i++)
    {
     var PosX:Number = (StationArr[i].X - PosXMIN)/10;
        var PosY:Number = (StationArr[i].Y - PosYMIN)/10;

     var mc:MovieClip;
        mc = station.content as MovieClip;
        
        var material:MovieMaterial = new MovieMaterial(station,false,false);
        material.fillColor = 0xF4F4F4;
        material.smooth = true;
        material.fillAlpha = 0;
        material.doubleSided = true;
     material.animated = true;
     material.interactive = true;
/*        
     var material:BitmapFileMaterial = new BitmapFileMaterial("http://.../assets/bus-stop.png" );
     material.doubleSided = true;
     material.smooth = true;
     material.lineAlpha = 0.1;
     material.lineColor = 0xFFFFFF;
     material.interactive = true;
*/     
     /*
     if (tUniqueId != "" && tUniqueId == StationArr[i].UNIQUEID.toString())
     {
      tObjW = 84 * (100/m.compo.camera.zoom);
      tObjH = 84 * (100/m.compo.camera.zoom);
     }
     else
     {*/
      tObjW = 42 * (100/m.compo.camera.zoom);
      tObjH = 42 * (100/m.compo.camera.zoom);
     //}
     
     var plane:Plane = new Plane( material, tObjW, tObjH, 1, 1);
     plane.x = PosX - m.compo.moveX;
     plane.y = PosY + m.compo.moveY; 
     plane.name = StationArr[i].ROUTEID + "_" + StationArr[i].ORD + "_" + StationArr[i].UNIQUEID + "_" + PosX.toString() + "_" + PosY.toString() ;;
     
     plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, stop_press);
     
     planeGroup.addChild(plane);
     }
     tUniqueId = "";
     m.compo.scene.addChild(planeGroup);
     currentState = '';
   }
   public function drawBusLine():void
   {
    var Buslines3D:Lines3D = new Lines3D();
    Buslines3D.name = "BusLine";
    for (var i:Number=0;i<LineArr.length;i++)
    {
     if (Number(LineArr[i].PREV_POSY)!=0&&Number(LineArr[i].PREV_POSX)!=0&&Number(LineArr[i].POSY)!=0&&Number(LineArr[i].POSX)!=0)
     {
      var PosX:Number = (LineArr[i].POSX - PosXMIN)/10;
         var PosY:Number = (LineArr[i].POSY - PosYMIN)/10;
         var PPosX:Number = (LineArr[i].PREV_POSX - PosXMIN)/10;
         var PPosY:Number = (LineArr[i].PREV_POSY - PosYMIN)/10;
         
      var BusLineMaterial:LineMaterial = new LineMaterial(0xFF0000);
      
      var v1:Vertex3D = new Vertex3D(PPosX-m.compo.moveX, PPosY+m.compo.moveY,0);
      var v2:Vertex3D = new Vertex3D(PosX-m.compo.moveX, PosY+m.compo.moveY,0);
      
      var Busline:Line3D = new Line3D(Buslines3D, BusLineMaterial, 2, v1, v2);
        
      Buslines3D.addLine(Busline);
     }
       }
     m.compo.scene.addChild(Buslines3D);
   }
   
   var tUniqueId:String = "";
   private function stop_press(e:InteractiveScene3DEvent):void
   {
    var tStr:String = e.target.name.toString();
    var tArr:Array = tStr.split("_");
    var routeid:String = tArr[0];
    var ord:String = tArr[1];
    tUniqueId = tArr[2];
    getInfoStation(routeid,ord,tUniqueId);
    fnChangeZoomSmooth(60,Number(tArr[3]),Number(tArr[4]));
   }
   private function getBusLoctQry_Result(e:ResultEvent):void
   {
    var table:ArrayCollection;// = e.result.DATA;
    var recordAC:ArrayCollection;
    recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
    
    try
    {
     for (var i:Number=0; i<10000;i++)
     {
      if (BusType == recordAC[0][i].BUSTYPE.toString())
      {
       var ObjR:Object = new Object();
       ObjR.BUSID = recordAC[0][i].BUSID;
       ObjR.BUSNUM = recordAC[0][i].BUSNUM;
       ObjR.BUSTYPE = recordAC[0][i].BUSTYPE;
       ObjR.ENDARRTM = recordAC[0][i].ENDARRTM;
       ObjR.MATCH_X = recordAC[0][i].MATCH_X;
       ObjR.MATCH_Y = recordAC[0][i].MATCH_Y;
       ObjR.OFFER_TIME = recordAC[0][i].OFFER_TIME;
       ObjR.ROUTE_DISTANCE = recordAC[0][i].ROUTE_DISTANCE;
       ObjR.STATION_STOP_FLAG = recordAC[0][i].STATION_STOP_FLAG;
       ObjR.UNIT_DISTANCE = recordAC[0][i].UNIT_DISTANCE;
       ObjR.UNIT_ID = recordAC[0][i].UNIT_ID;
       ObjR.UNIT_ORD = Number(recordAC[0][i].UNIT_ORD);
       
       BusArr.push(ObjR);
      }
     }
    }
    catch(e:Error)
    {}
    drawBus();
    CursorManager.removeBusyCursor();
   }
   var BusUnique:String = "";
   private function bus_press(e:InteractiveScene3DEvent):void
   {
    var tStr:String = e.target.name.toString();
    var tArr:Array = tStr.split("_");
    getInfoBus(tArr[0]);
    BusUnique = tArr[0];
    fnChangeZoomSmooth(60,Number(tArr[1]),Number(tArr[2]));
   }
   var LineArr:Array = new Array();
   //var Buslines3D:Lines3D;
   
   private function getRtofPlineQry_Result(e:ResultEvent):void
   {
    var table:ArrayCollection;
    var recordAC:ArrayCollection;
    recordAC = (e.result.DATA is ArrayCollection) ?     e.result.DATA as ArrayCollection :     new ArrayCollection(ArrayUtil.toArray(e.result.DATA));
    
    try
    {
     for (var i:Number=0; i<10000;i++)
     {
      var ObjR:Object = new Object();
      
      ObjR.POSX = Number(recordAC[0][i].POSX);
      ObjR.POSY = Number(recordAC[0][i].POSY);
      ObjR.PREV_POSX = Number(recordAC[0][i].PREV_POSX);
      ObjR.PREV_POSY = Number(recordAC[0][i].PREV_POSY);
      
      LineArr.push(ObjR);
     }
    }
    catch(e:Error)
    {}
    
    drawBusLine();
     getBusStopDataByBusCode(nCode);
   }
  
   private function onMouseDown(e:MouseEvent):void{  
    m.compo.stage_mouseDown();
    if (IdPopupCanvas.visible == true)
    {
     IdPopupCanvas.visible = false;
    }
         }  
        
         private function onMouseUp(e:MouseEvent):void{
          m.compo.stage_mouseUp();
         }
   private function onMouseWheel(e:MouseEvent):void{
             if (e.delta > 0)
             {fnChangeZoom(10);}
             else
             {fnChangeZoom(-10);}
            
             if (IdPopupCanvas.visible == true)
    {
     IdPopupCanvas.visible = false;
    }
         }
        
         var tObjW:Number = 0;
         var tObjH:Number = 0;
         public function fnChangeZoom(varVal:Number):void
   {
    if(m.compo.camera.zoom + varVal>0)
    {
     m.compo.camera.zoom = m.compo.camera.zoom + varVal;
     
     //일단 지우고 시작.
     m.compo.scene.removeChildByName("Bus");
     m.compo.scene.removeChildByName("Station");
     m.compo.scene.removeChildByName("Estimate");
     m.compo.scene.removeChildByName("mapLine");
     m.compo.scene.removeChildByName("BusLine");
     
     m.compo.drawMap();
     m.compo.drawEstimate();
     
     drawBusLine();
     drawBus();
     drawStation(); 
     
     if (m.compo.ObjRotationZ > 0)
     {
      fnAutoChangeZ(m.compo.ObjRotationZ);
      //m.compo.ObjRotationZ = 0;
     }
    }
   }
   var ZoomTimer:Timer = new Timer(20);
   var DestZoom:Number = 0;
   var oriX:Number = 0;
   var oriY:Number = 0;
   var StepX:Number = 0;
   var StepY:Number = 0;
   var DestX:Number = 0;
   var DestY:Number = 0;
   public function fnChangeZoomSmooth(varVal:Number,DestXPos:Number,DestYPos:Number):void
   {
    /*
    fnReset(); // 중심점 잡고
    
    //기준 = 24 Step
    var oObj:DisplayObject3D = m.compo.scene.getChildByName("Station");
    oriX = oObj.x;
    oriY = oObj.y;
    
    StepX = (Math.abs(0 - oriX) + Math.abs(0 - DestXPos));
    StepY = (Math.abs(0 - oriY) + Math.abs(0 - DestYPos));
    
    m.compo.moveX = StepX;
    m.compo.moveY = StepY;
    
    StepX = StepX/(varVal - m.compo.camera.zoom);
    StepY = StepY/(varVal - m.compo.camera.zoom);
    
    DestZoom = varVal;
    
    DestX = DestXPos;
    DestY = DestYPos;
    ZoomTimer.addEventListener(TimerEvent.TIMER,fnChangeZoomSmoothActive);
    ZoomTimer.start();
    */
    fnReset(); // 중심점 잡고
    
    //기준 = 24 Step
    var oObj:DisplayObject3D = m.compo.scene.getChildByName("Station");
    oriX = oObj.x;
    oriY = oObj.y;
    
    StepX = (Math.abs(0 - oriX) + Math.abs(0 - DestXPos));
    StepY = (Math.abs(0 - oriY) + Math.abs(0 - DestYPos));
    
    m.compo.moveX = StepX;
    m.compo.moveY = StepY;
    
    StepX = StepX/(varVal - m.compo.camera.zoom);
    StepY = StepY/(varVal - m.compo.camera.zoom);
    
    DestZoom = varVal;
    
    DestX = DestXPos;
    DestY = DestYPos;
    
    //-----------------------------------------------
    //for (var i:Number = 0;i<varVal;i++)
    //{
     m.compo.camera.zoom += 1 * 60;
     var tArr:Array = [{data:"mapLine"},{data:"Estimate"},{data:"BusLine"},{data:"Station"},{data:"Bus"}];
     for (var i:Number=0;i<tArr.length;i++)
     {
      try
      {
       var oObj:DisplayObject3D = m.compo.scene.getChildByName(tArr[i].data);
        if(DestX>0)
        {
         oObj.x = oObj.x + StepX*60;
        }
        else
        {
         oObj.x = oObj.x - StepX*60;
        }
        if(DestY>0)
        {
         oObj.y = oObj.y - StepY*60;
        }
        else
        {
         oObj.y = oObj.y + StepY*60;
        }
       }
       catch(e:Error){}
      }
    //}
    var oObjt:DisplayObject3D = m.compo.scene.getChildByName("Station");
    var resX:Number = oObjt.x;
    var resY:Number = oObjt.y;
    
    m.compo.moveX = resX;
    m.compo.moveY = resY;
    
    m.compo.scene.removeChildByName("Bus");
    m.compo.scene.removeChildByName("Station");
    m.compo.scene.removeChildByName("Estimate");
    m.compo.scene.removeChildByName("mapLine");
    m.compo.scene.removeChildByName("BusLine");
    
    m.compo.drawMap();
    m.compo.drawEstimate();
    
    drawBusLine();
    drawBus();
    drawStation();
   }
   private function fnChangeZoomSmoothActive(e:TimerEvent):void
   {
    if (m.compo.camera.zoom<DestZoom)
    {
     m.compo.camera.zoom += 1;
     var tArr:Array = [{data:"mapLine"},{data:"Estimate"},{data:"BusLine"},{data:"Station"},{data:"Bus"}];
     for (var i:Number=0;i<tArr.length;i++)
     {
      try
      {
       var oObj:DisplayObject3D = m.compo.scene.getChildByName(tArr[i].data);
        if(DestX>0)
        {
         oObj.x = oObj.x + StepX;
        }
        else
        {
         oObj.x = oObj.x - StepX;
        }
        if(DestY>0)
        {
         oObj.y = oObj.y - StepY;
        }
        else
        {
         oObj.y = oObj.y + StepY;
        }
       }
       catch(e:Error){}
      }
    }
    else
    {
     ZoomTimer.stop();
     
     var oObj:DisplayObject3D = m.compo.scene.getChildByName("Station");
     var resX:Number = oObj.x;
     var resY:Number = oObj.y;
     
     m.compo.moveX = resX;
     m.compo.moveY = resY;
     
     m.compo.scene.removeChildByName("Bus");
     m.compo.scene.removeChildByName("Station");
     m.compo.scene.removeChildByName("Estimate");
     m.compo.scene.removeChildByName("mapLine");
     m.compo.scene.removeChildByName("BusLine");
     
     m.compo.drawMap();
     m.compo.drawEstimate();
     
     drawBusLine();
     drawBus();
     drawStation();
    }
   }
   
   import org.papervision3d.cameras.Camera3D;
   public function fnChangeYAxis(varVal:Number):void
   {
    m.compo.fnchangeYAxis(varVal);
   }
   public function fnChangeXAxis(varVal:Number):void
   {
    m.compo.fnchangeXAxis(varVal);
   }
   public function fnChangeZ(varVal:Number):void
   {
    m.compo.fnChangeZAxis(varVal);
   }
   public function fnAutoChangeZ(varVal:Number):void
   {
    m.compo.fnAutoChangeZAxis(varVal);
   }
   
   public function fnReset():void
   {
    m.compo.camera.zoom = 16;
    m.compo.fnSetChangeXAxis(0);
    m.compo.fnSetChangeYAxis(60);
    m.compo.fnSetZAxisInit();
    m.compo.fnSetChangeYAxis(-360);
    m.compo.fnResetXYAxisPoint();
    m.compo.moveX = 0;
    m.compo.moveY = 0;
    
    m.compo.fnForceRender();
    
    MainCanvas.addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel);
    MainCanvas.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);  
             MainCanvas.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
   }
   
  ]]>
 </mx:Script>
 <mx:Style source="style/style.css"/>
 <mx:Canvas width="669" height="519" id="MainCanvas" backgroundColor="#FFFFFF">
  <mx:Canvas id="IdRemoteCanvas" width="326" height="55" alpha="0.4" mouseOver="IdRemoteCanvas.alpha=1;" mouseOut="IdRemoteCanvas.alpha=0.4;" x="171.5">
    <mx:Button x="272" y="9" click="fnChangeZoom(10);" styleName="Zoom"/>
    <mx:Button x="11" y="9" click="fnChangeZoom(-10);" styleName="Out"/>
    <mx:Button x="184" y="9" click="fnChangeYAxis(-150);" styleName="ThirdDUp"/>
    <mx:Button x="98" y="9" click="fnChangeZ(25);" styleName="RotateL"/>
    <mx:Button x="141" y="9" click="fnChangeZ(-25);" styleName="RotateR"/>
    <mx:Button x="228" y="9" click="fnChangeYAxis(150);" styleName="ThirdDDown"/>
    <mx:Button x="55" y="9" click="fnReset();" styleName="Home"/>
  </mx:Canvas>
  <mx:Canvas x="219" y="58" width="212" height="204" styleName="PopupCanvas" id="IdPopupCanvas" click="IdPopupCanvas.visible=false;" visible="false">
   <mx:TextArea x="11" y="13" width="187" height="154" id="IdPopupText" borderStyle="none" fontSize="12"/>
  </mx:Canvas>
  <mx:SWFLoader id="bus" source="http://.../assets/bus_b.swf" visible="false"/>
  <mx:SWFLoader id="station" source="http://.../assets/bus_stop.swf" visible="false"/>
 </mx:Canvas>
</mx:Application>

2. Component : Comp.mxml

package com
{
 import flash.events.Event;
 import flash.geom.Point;
 
 import mx.rpc.events.*;
 import mx.rpc.soap.*;
 
 import org.papervision3d.cameras.Camera3D;
 import org.papervision3d.core.geom.Lines3D;
 import org.papervision3d.core.geom.renderables.Line3D;
 import org.papervision3d.core.geom.renderables.Vertex3D;
 import org.papervision3d.core.math.Number3D;
 import org.papervision3d.materials.BitmapFileMaterial;
 import org.papervision3d.materials.special.LineMaterial;
 import org.papervision3d.objects.DisplayObject3D;
 import org.papervision3d.objects.primitives.Plane;
 import org.papervision3d.view.BasicView;
 
 [SWF(width='100%',height='100%',backgroundColor='0xF4F4F4',frameRate='300')]
 
 public class Seoul3DCom extends BasicView
 {
  protected var SeoulLineMaterial:LineMaterial;
  public var lines3D:Lines3D;
  private var cam:Camera3D;
  var PosXMIN:Number = 0;
  var PosYMIN:Number = 0;
  var EstimateArr:Array = [{X:198174,Y:452592},{X:205575,Y:461000},{X:196248,Y:439678},{X:208670,Y:445678},{X:199607,Y:453478}];
  var planeGroupEstimate:DisplayObject3D;
  
  public function Seoul3DCom()
  {
   //배경색상
   this.opaqueBackground = 0xF4F4F4;
   super(1, 1, true, true);
   initScene();
   
   startRendering();
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  
  private var isMouseDown:Boolean = false;
  
  public function stage_mouseDown():void
  {
   isMouseDown = true;
  }
 
  public function stage_mouseUp():void
  {
   isMouseDown = false; 
  }

  function onEnterFrame(e:Event):void
        {
         renderer.renderScene(scene, camera, viewport);
        }
  public function fnForceRender():void
  {
   renderer.renderScene(scene, camera, viewport);
  }
  protected function initScene():void
  {
   
   
   this._camera.y = -360;
   
   PosXMIN = 177371 + 22000;
   PosYMIN = 468477 - 20000;
   
   drawMap();
   drawEstimate();
  }
  
  private var previousMousePoint:Point = new Point();
  private static const FORWARD:Number3D = new Number3D(0, 0, 1);
  public var moveX:Number = 0;
  public var moveY:Number = 0;

  override protected function onRenderTick(event:Event=null):void
  {
   var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
 
   if(isMouseDown)
   {
    var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
     
     var oObj:DisplayObject3D = this.scene.getChildByName("mapLine");
     oObj.x = oObj.x - (previousMousePoint.x - currentMousePoint.x)*3;
     oObj.y = oObj.y + (previousMousePoint.y - currentMousePoint.y)*3;
     
     var oObj2:DisplayObject3D = this.scene.getChildByName("Estimate");
     oObj2.x = oObj2.x - (previousMousePoint.x - currentMousePoint.x)*3;
     oObj2.y = oObj2.y + (previousMousePoint.y - currentMousePoint.y)*3;
     
     try{
      var oObj3:DisplayObject3D = this.scene.getChildByName("BusLine");
      oObj3.x = oObj3.x - (previousMousePoint.x - currentMousePoint.x)*3;
      oObj3.y = oObj3.y + (previousMousePoint.y - currentMousePoint.y)*3;
     }
     catch(e:Error){}
     try{
      var oObj4:DisplayObject3D = this.scene.getChildByName("Station");
      oObj4.x = oObj4.x - (previousMousePoint.x - currentMousePoint.x)*3;
      oObj4.y = oObj4.y + (previousMousePoint.y - currentMousePoint.y)*3;
     }
     catch(e:Error){}
     try{
      var oObj5:DisplayObject3D = this.scene.getChildByName("Bus");
      oObj5.x = oObj5.x - (previousMousePoint.x - currentMousePoint.x)*3;
      oObj5.y = oObj5.y + (previousMousePoint.y - currentMousePoint.y)*3;
     }
     catch(e:Error){}
     
     moveX = moveX + (previousMousePoint.x - currentMousePoint.x)*3;
    moveY = moveY + (previousMousePoint.y - currentMousePoint.y)*3;
   }
 
   previousMousePoint = currentMousePoint;
   
   super.onRenderTick(event);
  }
  
  public function fnchangeXAxis(varVal:Number):void
  {
   this._camera.x = this._camera.x + varVal;
  }
  public function fnSetChangeXAxis(varVal:Number):void
  {
   this._camera.x = varVal;
  }
  public function fnchangeYAxis(varVal:Number):void
  {
   this._camera.y = this._camera.y + varVal;
  }
  public function fnSetChangeYAxis(varVal:Number):void
  {
   this._camera.y = varVal;
  }
  public var ObjRotationZ:Number = 0;
  public function fnChangeZAxis(varVal:Number):void
  {
   try
   {
    this.planeGroupEstimate.rotationZ += varVal;
    this.lines3D.rotationZ += varVal;
    var tObjBusLine:DisplayObject3D = scene.getChildByName("BusLine");
    tObjBusLine.rotationZ += varVal;
    var tObjStation:DisplayObject3D = scene.getChildByName("Station");
    tObjStation.rotationZ += varVal;
    var tObjBus:DisplayObject3D = scene.getChildByName("Bus");
    tObjBus.rotationZ += varVal;
    
    ObjRotationZ += varVal;
   }
   catch(e:Error){}
  }
  public function fnAutoChangeZAxis(varVal:Number):void
  {
   try
   {
    this.planeGroupEstimate.rotationZ += varVal;
    this.lines3D.rotationZ += varVal;
    var tObjBusLine:DisplayObject3D = scene.getChildByName("BusLine");
    tObjBusLine.rotationZ += varVal;
    var tObjStation:DisplayObject3D = scene.getChildByName("Station");
    tObjStation.rotationZ += varVal;
    var tObjBus:DisplayObject3D = scene.getChildByName("Bus");
    tObjBus.rotationZ += varVal;
   }
   catch(e:Error){}
  }
  public function fnSetZAxisInit():void
  {
   try
   {
    this.planeGroupEstimate.rotationZ =0;
    this.lines3D.rotationZ =0;
    var tObjBusLine:DisplayObject3D = scene.getChildByName("BusLine");
    tObjBusLine.rotationZ =0;
    var tObjStation:DisplayObject3D = scene.getChildByName("Station");
    tObjStation.rotationZ =0;
    var tObjBus:DisplayObject3D = scene.getChildByName("Bus");
    tObjBus.rotationZ =0;
    
    ObjRotationZ = 0;
   }
   catch(e:Error){}
  }
  
  
  public function fnResetXYAxisPoint():void
  {
   var tArr:Array = [{data:"mapLine"},{data:"Estimate"},{data:"BusLine"},{data:"Station"},{data:"Bus"}];
   for (var i:Number=0;i<tArr.length;i++)
   {
    try
    {
     var oObj:DisplayObject3D = this.scene.getChildByName(tArr[i].data);
      oObj.x = 0;// oObj.x + moveX;
     oObj.y = 0;// oObj.y - moveY;
     }
     catch(e:Error){}
    }
    
  }
  
  public function drawMap():void
  {
   var mapArr:Array = getMap();
   
   lines3D = new Lines3D();
   lines3D.name = "mapLine";
   
   for (var p:Number = 0;p<mapArr.length;p++)
   {
    mapArr[p].x1 = (Number(mapArr[p].x1) - PosXMIN)/10;
    mapArr[p].y1 = (Number(mapArr[p].y1) - PosYMIN)/10;
    mapArr[p].x2 = (Number(mapArr[p].x2) - PosXMIN)/10;
    mapArr[p].y2 = (Number(mapArr[p].y2) - PosYMIN)/10;
   }
   
   for (var i:Number = 0;i<mapArr.length;i++)//100;i++)//mapArr.length;i++)
   {
    SeoulLineMaterial = new LineMaterial(0xDADADA);
    
    var v1:Vertex3D = new Vertex3D(mapArr[i].x1 - moveX, mapArr[i].y1 + moveY, 0);
    var v2:Vertex3D = new Vertex3D(mapArr[i].x2 - moveX, mapArr[i].y2 + moveY, 0);
    
    var line:Line3D = new Line3D(lines3D, SeoulLineMaterial, 2, v1, v2);
      
    lines3D.addLine(line);
   }
   scene.addChild(lines3D);
  }
  
  public function drawEstimate():void
  {
   planeGroupEstimate = new DisplayObject3D();
   planeGroupEstimate.name = "Estimate";
   
   for (var i:Number=0;i<EstimateArr.length;i++)
   {
    var PosX:Number = (EstimateArr[i].X - PosXMIN)/10;
       var PosY:Number = (EstimateArr[i].Y - PosYMIN)/10;
       
    var material:BitmapFileMaterial = new BitmapFileMaterial( "http://.../assets/icon"+(i+1).toString()+".png" );
    material.doubleSided = true;
    material.smooth = true;
    material.lineAlpha = 0;
    material.lineColor = 0xFFFFFF;
    material.interactive = true;
    
    var Height:Number = 150;//195 - (camera.zoom*1.3);
    var Width:Number = 150;//105 - (camera.zoom*1.3); 
    
    var plane:Plane = new Plane( material, Width, Height, 1, 1);
    plane.x = PosX - moveX;
    plane.y = PosY + moveY; 
    
    planeGroupEstimate.addChild(plane);
    }
    scene.addChild(planeGroupEstimate);
  }
  
  public function getMap():Array
  {
   var tStr:String = "197860^459048^198580^459768||198580^459768^200740^465368||200740^465368^201780^466808||201780^466808^204660^465048||204660^465048^208500^465368||208500^465368^208580^460648||208580^460648^209300^457848||209300^457848^210420^455288||210420^455288^208900^452648||208900^452648^210180^450808||210180^450808^215540^453528||215540^453528^216180^449688||216180^449688^212580^446488||212580^446488^213940^444408||213940^444408^210980^440968||210980^440968^208500^439768||208500^439768^205700^436648||205700^436648^203220^438008||203220^438008^202820^440648||202820^440648^201140^439528||201140^439528^200180^440968||200180^440968^199060^440088||199060^440088^196820^438088||196820^438088^195380^437768||195380^437768^193700^438968||193700^438968^191540^437208||191540^437208^188740^443048||188740^443048^188420^443928||188420^443928^193220^443288||193220^443288^185460^441848||185460^441848^183620^442008||183620^442008^184340^443608||184340^443608^183620^444168||183620^444168^184500^445608||184500^445608^184420^449048||184420^449048^182100^449048||182100^449048^179620^450568||179620^450568^181620^453368||181620^453368^182420^454568||182420^454568^182660^456168||182660^456168^187220^452408||187220^452408^189700^454568||189700^454568^191300^454808||191300^454808^192260^460568||192260^460568^195780^461848||195780^461848^196580^458968||196580^458968^197860^459048||209460^457848^207780^457768||207780^457768^206340^457368||206340^457368^205540^457208||205540^457208^204500^458168||204500^458168^203780^459048||203780^459048^204340^460568||204340^460568^204820^459928||204820^459928^204660^462168||204660^462168^204180^463528||204180^463528^204580^465128||200740^465048^201700^463528||201700^463528^201060^461448||201060^461448^203060^460088||203060^460088^203780^459048||203780^459048^204500^458168||204500^458168^203060^456888||203060^456888^200900^457608||200900^457608^200580^458408||200580^458408^199620^459048||199620^459048^198660^459688||206340^457368^206340^456328||206340^456328^206260^455128||206260^455128^206420^453928||206420^453928^206900^452408||206900^452408^208100^452248||208100^452248^208900^452808||206340^456328^205380^455768||205380^455768^204580^455608||204580^455608^203700^454808||203700^454808^202180^453288||202180^453288^200900^453448||200900^453448^200660^454088||200660^454088^200180^454648||200180^454648^198820^454968||198820^454968^198340^455928||198340^455928^199060^456808||199060^456808^198580^458008||198580^458008^198020^459128||||||210340^450808^209700^449368||209700^449368^208660^448008||208660^448008^206980^446968||206980^446968^206020^447208||206020^447208^205060^447688||205060^447688^206580^451048||206580^451048^206900^452408||||||212580^446568^210580^447688||210580^447688^210900^448728||210900^448728^209700^449368||||||210820^440808^209380^443608||209380^443608^206180^444968||206180^444968^206020^447208||||||206580^451048^205220^451448||205220^451448^204340^452168||204340^452168^203380^452488||203380^452488^202100^452408||202100^452408^202180^453288||||||205060^447688^203940^448328||203940^448328^201700^448408||201700^448408^200740^449448||200740^449448^201620^450728||201620^450728^202260^451448||202260^451448^202100^452408||||||208420^439608^207300^441688||207300^441688^204500^440888||204500^440888^203620^442808||203620^442808^202980^442888||202980^442888^201540^446808||201540^446808^200900^447448||200900^447448^201700^448408||||||198980^440008^198340^442008||198340^442008^198420^445128||198420^445128^200900^447448||||||196500^458888^195700^458408||195700^458408^195620^456728||195620^456728^194180^455048||194180^455048^192500^454168||192500^454168^191300^452968||191300^452968^189220^454168||||||195620^456728^196020^455528||196020^455528^196020^453208||196020^453208^197060^451768||197060^451768^197380^451288||197380^451288^196740^450968||196740^450968^194260^450568||194260^450568^193700^451208||193700^451208^193700^451688||193700^451688^191300^452968||||||202100^452408^200420^452168||200420^452168^199300^452008||199300^452008^197940^452328||197940^452328^197060^451768||||||200740^449448^199780^449928||199780^449928^198420^450328||198420^450328^196900^450328||196900^450328^196740^450968||||||196900^450328^195380^448248||195380^448248^194180^448968||194180^448968^191700^449128||191700^449128^191140^449768||191140^449768^189460^450808||189460^450808^187140^452568||||||198420^445128^195620^446568||195620^446568^195380^448248||||||189460^450808^189380^449848||189380^449848^188980^449768||188980^449768^188180^450168||188180^450168^188020^448008||188020^448008^185940^447688||185940^447688^185060^449608||185060^449608^184340^448888||||||189380^449848^190420^448088||190420^448088^189460^447448||189460^447448^189300^446648||189300^446648^188900^445128||188900^445128^187700^445528||187700^445528^185700^444968||185700^444968^184500^445608||||||189300^446648^190420^445688||190420^445688^190660^443528||190660^443528^191380^442888||191380^442888^191060^442088||191060^442088^190100^442408||190100^442408^189460^442968||189460^442968^188820^443048||||||195620^446568^193620^446248||193620^446248^192900^444408||192900^444408^192260^444248||192260^444248^191380^442888||||||198340^442008^197540^441848||197540^441848^196660^442568||196660^442568^196500^443848||196500^443848^195460^443768||195460^443768^194260^443688||194260^443688^193620^444008||193620^444008^193300^443448||193300^443448^192180^443048||192180^443048^191380^442888||||||193780^438968^193060^439768||193060^439768^192500^439928||192500^439928^192180^441528||192180^441528^192100^442328||192100^442328^191060^442088";
   var tArr:Array = tStr.split("||");
   var mapArr:Array = new Array();
   for (var a:Number = 0;a<tArr.length;a++)
   {
    var sArr:Array = tArr[a].toString().split("^");
    var Obj:Object = new Object();
    Obj.x1 = sArr[0];
    Obj.y1 = sArr[1];
    Obj.x2 = sArr[2];
    Obj.y2 = sArr[3];
    mapArr.push(Obj);
   }
   return mapArr;
  }
 }
}

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 애매모애 | 2009/11/13 17:33 | Flex | 트랙백 | 덧글(0)

트랙백 주소 : http://cherin.egloos.com/tb/2748492
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶