加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用PV3D在Flex中实现全景360

发布时间:2020-12-15 00:58:06 所属栏目:百科 来源:网络整理
导读:PV3D采用的是左手坐标系,默认的X正向指向屏幕右侧,Y正向指向屏幕上方,Z正向垂直屏幕向内,下图左侧为左手坐标系,用户默认的观察视角是沿着Z轴的负半轴方向。 将实景360场景封装为一个类,代码如下: package{import flash.display.Sprite;import flash.e

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,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,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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读