用PV3D在Flex中实现全景360
来源:互联网 发布:linux 刻录光盘 编辑:程序博客网 时间:2024/06/06 03:31
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>
- 用PV3D在Flex中实现全景360
- 用PV3D在Flex中实现全景360
- Flex+pv3d 打造三维全景图 大 | 中 | 小
- 360全景实现
- pv3d技术中的全景浏览的FreeCamera3D.as
- 在Flex/ActionScript3中实现单例
- 在FLEX中实现鹰眼图
- 在flex中动态实现RemoteObject
- 在iOS利用动画实现全景视图
- 如何在全景页面中调用JS
- 浏览器中实现3D全景浏览
- 在PV3D中获取鼠标点击位置的空间坐标信息
- 用FLASH CS3运行PV3D
- 全景图(二):在Unity3D上实现360°柱面投影
- 全景图(三):在Unity3D上实现360°球面投影
- 在讨论全景视频的未来之前,我们先搞清楚全景视频是如何实现的
- HTML5 Canvas实现360度全景图
- HTML5 Canvas实现360度全景图
- 【Leetcode】Reverse Linked List II
- UVaOJ 112 Tree Suming
- SpringMVC Rest & ibatis3 在线示例参考
- fprintf函数调用出core
- Oracle 绑定变量
- 用PV3D在Flex中实现全景360
- jcharts画线图,饼图和柱状图
- 创建和使用静态库
- Android配置文件
- hdu 数值统计
- Android----基础----第七天----Activity
- zoj 1372
- DLL重定向
- 转:用互联网玩转线下生意!