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让平面面向屏幕。