http://blog.csdn.net/sunqunsunqun/article/details/7168648#comments
PV3D采用的是左手坐标系,默认的X正向指向屏幕右侧,Y正向指向屏幕上方,Z正向垂直屏幕向内,下图左侧为左手坐标系,用户默认的观察视角是沿着Z轴的负半轴方向。

将实景360场景封装为一个类,代码如下:
- package??
- {??
- ????import?flash.display.Sprite;??
- ????import?flash.events.Event;??
- import?flash.events.MouseEvent;??
- ??????
- import?mx.controls.Alert;??
- import?org.papervision3d.cameras.Camera3D;??
- import?org.papervision3d.materials.BitmapFileMaterial;??
- import?org.papervision3d.materials.utils.BitmapMaterialTools;??
- import?org.papervision3d.objects.primitives.Cylinder;??
- import?org.papervision3d.objects.primitives.Sphere;??
- import?org.papervision3d.render.BasicRenderEngine;??
- import?org.papervision3d.scenes.Scene3D;??
- import?org.papervision3d.view.Viewport3D;??
- ??????
- public?class?MyPV3D?extends?Sprite??
- ????{??
- ????????private?var?sphere:Sphere;??
- ????????private?var?myMouseDown:Boolean?=?false;??
- private?var?viewport:Viewport3D;??
- private?var?scene:Scene3D;??
- private?var?camera:Camera3D;??
- private?var?render:BasicRenderEngine;??
- ??????????
- private?var?bMouseMove:Boolean?=?private?var?OldMouseX:Number?=?-1;??
- private?var?OldMouseY:Number?=?-1;??
- public?function?MyPV3D(str:String)??
- ????????{??
- ????????????super();??
- ????????????init(str);??
- ????????}?????????????
- private?function?init(str:String):void??
- ????????????initObj(str);??
- ??????????????
- ??????????????
- ????????????addEventListener(Event.ENTER_FRAME,onEnterFrame);??
- ??????????????
- ????????????addEventListener(MouseEvent.MOUSE_DOWN,?onMouseDown);??
- ????????????addEventListener(MouseEvent.MOUSE_UP,?onMouseUp);??
- ??????????????
- ????????????addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);??
- ????????????addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel);??
- ????????}??
- private?function?initObj(str:String): ????????????viewport=new?Viewport3D(700,500);??
- ????????????addChild(viewport);??
- ????????????scene?=?new?Scene3D();??
- ????????????camera?=?new?Camera3D();??
- ????????????render=new?BasicRenderEngine();??
- ????????????var?material:BitmapFileMaterial=new?BitmapFileMaterial(str);????
- //PV3D默认情况下不显示背面,doubleSided属性应设为true??
- ????????????material.doubleSided?=?true;??
- ????????????material.opposite?=?false;??
- ????????????material.smooth?=?//实例化球体???
- ????????????sphere=new?Sphere(material,0); background-color:inherit">200,0); background-color:inherit">50,0); background-color:inherit">50);??
- ????????????sphere.scaleX?=?sphere.scaleX*(-1);??
- ????????????scene.addChild(sphere);??
- //把摄像机移到中心位置,PV3D摄像机的默认位置是camera.z=-1000??
- ????????????camera.z=0;??
- //摄象机的缩放参数,??
- ????????????camera.zoom=.8;??
- //摄象机的焦距??
- ????????????camera.focus=300;??
- ????????????render.renderScene(scene,?camera,?viewport);??
- //this.useHandCursor?=?true;显示为手型??
- //this.buttonMode?=?true;??
- private?function?onEnterFrame(e:Event): ????????{?????
- ????????????render.renderScene(scene,?viewport);??
- ????????}??
- ??????????
- private?function?onMouseDown(event:MouseEvent):void??
- ????????{??
- ????????????myMouseDown?=?true;??
- this.OldMouseX?=?this.mouseX;??
- ????????????this.OldMouseY?=?this.mouseY;??
- private?function?onMouseUp(event:MouseEvent): ????????????myMouseDown?=?this.OldMouseX?=?-this.OldMouseY?=?-private?function?onMouseMove(event:MouseEvent):if(myMouseDown)??
- ????????????{?????????????????
- ????????????????if(this.OldMouseX?<?0?||?this.OldMouseY?<?0?)??
- ????????????????{??
- ????????????????????this.mouseX;??
- ????????????????????this.mouseY;??
- ????????????????}??
- ????????????????else??
- ????????????????{??
- ????????????????????var?DeltaX:Number?=?this.mouseX?-?this.OldMouseX;??
- ????????????????????var?DeltaY:Number?=?this.mouseY?-?this.OldMouseY;??
- ????????????????????camera.rotationY?+=?DeltaX*0.5;??
- ????????????????????camera.rotationX?+=?DeltaY*0.5;??
- ??????????????????????
- if?(camera.rotationX?<=?-90)??
- ????????????????????{??
- ????????????????????????camera.rotationX?=?-90;??
- ????????????????????}??
- else?if?(camera.rotationX?>=? ????????????????????????camera.rotationX?=? ????????????????????render.renderScene(scene,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????????????}?????????????????
- ????????????}??
- private?function?onMouseWheel(event:MouseEvent):if(event.delta?>?0)??
- ????????????{??
- if(camera.zoom?>?0.6)??
- ????????????????????camera.zoom?*=?0.95;??
- ????????????}??
- if(event.delta?<?0)??
- ????????????{??
- ????????????????camera.zoom?*=?1.05;??
- ????}??
- }??
然后在一个Flex程序中使用该全景类,如下图所示:
copy
<?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"?minWidth="955"?minHeight="600"??
- ???????????????creationComplete="App_creationCompleteHandler(event)"?>??
- ????<fx:Script>??
- ????????<![CDATA[??
- import?mx.core.UIComponent;??
- import?mx.events.FlexEvent;??
- protected?function?App_creationCompleteHandler(event:FlexEvent): ??????????????????
- this.CreatePV3D();??
- ??????????????????
- private?function?CreatePV3D(): ????????????????var?Path:String?=?"../Images/pv3d.jpg";??
- ????????????????var?iPV3D:MyPV3D?=?new?MyPV3D(Path);??
- ????????????????var?iUI:UIComponent?=?new?UIComponent();??
- ????????????????iUI.addChild(iPV3D);??
- ????????????????iCanvas.addChild(iUI);??
- ????????]]>??
- ????</fx:Script>??
- ????<fx:Declarations>??
- ????????<!--?将非可视元素(例如服务、值对象)放在此处?-->??
- ????</fx:Declarations>??
- ????<mx:Canvas?id="iCanvas"?width="700"?height="500"/>??
- </s:Application>??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|