Away3D学习笔记--简单交互
首先是句题外话,PV3D虽然性能不错,但似乎很久不更新,而且许多功能还处于残废状态,Away3D是在PV3D基础上开发的,许多基础工作还做的好的多。所以项目对性能要求不那么高,最终选用Away3D,而非高性能的PV3D。项目需要让用户通过flash创建一系列几何体,并保存下来。作为练习,这里先尝试让用户创建最基本的几何体:平面。
首先需要弄清楚Away3D中的坐标关系,Away3D采用左手坐标系,坐标原点依然在舞台正中央。通过stage.addEventListener方法得到的鼠标坐标是相对于右上角点的坐标,不能直接用在Away3D中定位,除非经过一系列换算。幸运的是,Away3D提供了内置的解决方法,就是利用Object3D的addOnMouseDown,addOnMouseUp等事件,用MouseEvent3D中的参数来定位。
MouseEvent3D中关于鼠标点击位置的参数有6个,分别是sceneX,sceneY,sceneZ和screenX,screenY,screenZ。后三个参数字面意思是鼠标相对于整个幕布的位置,可是通过trace显示来看,数值很怪异。而前三个参数刚好就是鼠标在scene中经过换算的正确位置。
Away3D中的基本体的坐标(x,y,z)值也是基本体中心对于scene的值。
然后就是让用户来画平面。总共需要相应三个事件,鼠标按下(记录初始点,创建平面对象),鼠标移动(动态更改平面宽高)和鼠标抬起(结束绘制)。
为了利用Away3D内置的事件捕捉,这里取个巧,事先在舞台上放置一个和舞台相同大小的平面,并设为黑色,利用这个平面的鼠标事件来相应用户操作。
完整代码如下:
package 
{
	import away3d.cameras.*;
	import away3d.containers.*;
	import away3d.core.base.Vertex;
	import away3d.core.utils.*;
	import away3d.debug.AwayStats;
	import away3d.events.MouseEvent3D;
	import away3d.materials.*;
	import away3d.primitives.*;
	
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	
	[SWF(backgroundColor="#000000", frameRate="100", quality="LOW", width="800", height="600")]
	
	public class test extends Sprite
	{	
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var view:View3D;	
		
		private var down:Boolean = false;  //鼠标按下标记
		private var begin:Vertex;   //起点坐标
		private var tp:Plane;       
		public function test() 
		{
			scene = new Scene3D();
			
			camera = new Camera3D();
			camera.z = -40;
			view = new View3D();
			view.scene= scene;
			view.camera = camera;
			addChild(view);
					
			var pl:Plane = new Plane();
			pl.width = 800;
			pl.height = 600;
			pl.yUp = false;
			pl.material = new ColorMaterial(0x000000);
			scene.addChild(pl);
			pl.addOnMouseDown(ondown);
			pl.addOnMouseMove(onmove);
			pl.addOnMouseUp(onup);
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		private function ondown(e:MouseEvent3D):void 
		{
			if (!down)
			{
				down = true;
				begin = new Vertex(e.sceneX, e.sceneY, 0);
				tp = new Plane();
				tp.width = 1;
				tp.height = 1;
				tp.x = e.sceneX;
				tp.y = e.sceneY;
				tp.yUp = false;
				tp.material = new ColorMaterial(0xFF0000);
				tp.pushfront = true;
				scene.addChild(tp);
			}
		}	
		private function onmove(e:MouseEvent3D):void
		{
			if (down)
			{
				tp.width = Math.abs(e.sceneX - begin.x);
				tp.height = Math.abs(e.sceneY - begin.y);
				tp.x=(begin.x + e.sceneX) / 2;
				tp.y = (begin.y + e.sceneY) / 2;
				
			}
		}	
		private function onup(e:MouseEvent3D):void
		{
			if (down)
			{
				down = false;
			}
		}
		private function onEnterFrame(e:Event):void
		{
			view.render();
		}
	}
}
			
Away3D创建的平面是默认放在xoz平面的,所以用plane.yUp=false让平面面向屏幕。
                    
                
                
            
        
浙公网安备 33010602011771号