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号