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 = false;
- 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.ROLL_OVER, onMouseUp);
- addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
- addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel);
- }
- private function initObj(str:String):void
- {
- 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 = true;
- //实例化球体
- sphere=new Sphere(material,200,50,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):void
- {
- render.renderScene(scene, camera, viewport);
- }
- private function onMouseDown(event:MouseEvent):void
- {
- myMouseDown = true;
- this.OldMouseX = this.mouseX;
- this.OldMouseY = this.mouseY;
- }
- private function onMouseUp(event:MouseEvent):void
- {
- myMouseDown = false;
- this.OldMouseX = -1;
- this.OldMouseY = -1;
- }
- private function onMouseMove(event:MouseEvent):void
- {
- if(myMouseDown)
- {
- if(this.OldMouseX < 0 || this.OldMouseY < 0 )
- {
- this.OldMouseX = this.mouseX;
- this.OldMouseY = 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 >= 90)
- {
- camera.rotationX = 90;
- }
- render.renderScene(scene, camera, viewport);
- this.OldMouseX = this.mouseX;
- this.OldMouseY = this.mouseY;
- }
- }
- }
- private function onMouseWheel(event:MouseEvent):void
- {
- if(event.delta > 0)
- {
- if(camera.zoom > 0.6)
- {
- camera.zoom *= 0.95;
- }
- }
- else if(event.delta < 0)
- {
- camera.zoom *= 1.05;
- }
- }
- }
- }
然后在一个Flex程序中使用该全景类,如下图所示:
- <?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):void
- {
- // TODO Auto-generated method stub
- this.CreatePV3D();
- }
- private function CreatePV3D():void
- {
- 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>