2009년 11월 13일
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)






