`
leitianfu
  • 浏览: 147952 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

用PV3D在Flex中实现全景360(转)

阅读更多
PV3D采用的是左手坐标系,默认的X正向指向屏幕右侧,Y正向指向屏幕上方,Z正向垂直屏幕向内,下图左侧为左手坐标系,用户默认的观察视角是沿着Z轴的负半轴方向。

将实景360场景封装为一个类,代码如下:
[java] view plaincopy
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程序中使用该全景类,如下图所示:
[java] view plaincopy
<?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> 
分享到:
评论

相关推荐

    flex全景pv3d

    flex全景as库。直接更改路径就能使用,非常方便,并且欢迎研究全景的同行加好友一起研究技术,多交流!

    pv3d简单全景

    在IT行业中,全景图是一种利用计算机...这个“pv3d简单全景”项目是一个很好的起点,对于想要学习如何在Flash中创建3D全景体验的AS3开发者来说,通过研究该项目的源代码,可以了解PV3D库的基本用法和全景图的实现原理。

    Demo.rar_3d_flex_flex Graphic._pv3d flex_pv3d fl

    描述中提到“利用PV3D做的flex DEMO 实现了#3D特效”,进一步确认了这个项目是使用Adobe Flex技术和Papervision3D(PV3D)库创建的一个3D效果展示。 Flex是一种基于ActionScript 3.0的开源框架,用于构建富互联网...

    pv3d+flex 自写例子

    在Flex中创建3D场景的基本步骤包括: 1. 引入PV3D所需的命名空间:`xmlns:pv3d="com.pv3d.*"`。 2. 创建一个PV3D的View3D组件,它是3D场景的容器:`&lt;pv3d:View3D id="view3d" width="100%" height="100%" /&gt;`。 3. ...

    pv3D全景源码

    在Flash中实现3D全景展示,能够让用户在网页上体验到类似真实环境的视觉效果,广泛应用于虚拟现实、在线展览、游戏等领域。 在这一源代码中,"mode3.as"很可能是一个关键的类文件,它包含了处理3D模型、动画以及...

    Flex全景Demo

    Flex全景Demo是一个基于Adobe Flex技术实现的互动全景展示应用,主要使用了PV3D库来构建三维全景体验。Flex是一种开源的、基于ActionScript 3的框架,它允许开发者创建丰富的互联网应用程序(RIA),提供了强大的...

    flex pv3d 照片浏览 照片墙

    标题中的“flex pv3d 照片浏览 照片墙”指的是使用Adobe Flex技术结合PV3D库开发的一款3D照片浏览应用,它创建了一种类似照片墙的展示效果,让用户能够以三维视角来查看和浏览照片。这种技术在Web前端开发中常用于...

    pv3d加入Flex控件及创建热点(附部分代码)

    在pv3d中,可以通过创建带有交互事件监听器的`DisplayObject3D`子类来实现热点功能。 在给定的代码片段中,`UrlPoint`类被定义为一个带有热点功能的平面对象。其构造函数接受多个参数,包括材质、宽度、高度等,...

    PV3d Papervision3d API文档+学习笔记+全景案例

    全景案例,如"Ball360.zip",是PV3D应用的典型展示,它实现了360度全景视图的效果。在这样的案例中,PV3D的相机控制和纹理映射功能得到了充分的利用。通过旋转3D球体,可以实现对周围环境的全方位查看,这种技术广泛...

    flex pv3d test

    这篇博客文章的链接虽然没有提供具体内容,但通常会包含作者关于如何使用PV3D在Flex环境中进行3D编程的见解、示例代码或者问题解决方案。432024可能是博客文章的唯一标识符,用于在iteye这个IT技术分享平台上定位该...

    用于flash中的PV3D 组件包

    在Flex中集成PV3D,首先需要在项目中引入PV3D的库文件。在提供的"pv3d类库"中,可能包含了PV3D的核心库和其他相关辅助类,例如Scene3D、Camera3D、Primitive、Material等。开发者可以通过导入这些类,然后在Flex应用...

    Pv3dPano完美的3D室内现场全景演示(flash 3d

    在当今的数字时代,3D技术已经深入到各个领域,特别是在室内设计和虚拟现实应用中,3D全景展示已经成为一种不可或缺的工具。Pv3dPano正是这样一款强大的3D室内现场全景演示解决方案,它通过Flash 3D技术,为用户提供...

    PV3D中文手册

    **PV3D中文手册**是针对PV3D(Pervasive 3D)技术的一份详细文档,旨在帮助用户理解并有效地使用这个强大的3D图形编程库。PV3D是基于ActionScript 3的,因此它与Adobe Flash Player和Adobe AIR平台紧密集成,允许...

    [转载] PV3D 全景的一个核心代码

    PV3D(Papervision3D)是一种基于Adobe Flash平台的开源3D图形库,它允许开发者在Web浏览器中创建交互式的三维场景。这个核心代码片段可能是PV3D实现全景展示的关键部分,下面我们将深入探讨其背后的原理和实现细节...

    PV3D源码包(1.5版本和1.7版本)

    《深入理解PV3D:1.5与1.7版本源码解析》 Papervision3D(PV3D)是Flex平台上的一个开源3D引擎,它为Adobe Flash和...在实际项目中,结合源码学习和实践,我们可以充分利用PV3D的功能,实现更高效、更逼真的3D效果。

    pv3d最新资源包

    PV3D是一种基于Adobe Flash Platform的3D图形编程库,它允许开发者在Flash Player或Adobe AIR环境中创建丰富的、交互式的3D应用程序。此资源包可能是为了帮助开发者们更好地利用PV3D进行项目开发,提供了最新的API、...

    flash 3d 360全景视图

    通过研究`Main.as`中的代码,可以学习如何使用Flab3D库或者结合PV3D来创建3D场景,而`Demo1.fla`则展示了如何在Flash环境中搭建和设计全景视图。通过查看和运行`Demo1.swf`,我们可以直观地看到实现的效果,并从中...

    pv3d flash 3d源码

    PV3D,全称为Papervision3D,是一个开源的Flash 3D图形渲染引擎,它允许开发者在Adobe Flash Player环境中构建复杂的三维交互式应用程序。PV3D为Web开发者提供了一个强大的工具,使他们能够利用Flash平台创建具有...

Global site tag (gtag.js) - Google Analytics