- 最后登录
- 2013-9-29
- 注册时间
- 2012-8-20
- 阅读权限
- 90
- 积分
- 6371
- 纳金币
- 6372
- 精华
- 0
|
项目需求: 空间中有一个球体,球体在视窗内显示时并不是全部显示,每次只显示球体的一部分,现在需要在FrameEnter事件中计算当前显示在窗口中的是球体的哪一部分,这个问题的根本,是要计算视窗/屏幕上四个角的点对应的是球体上的哪四个点,即要把屏幕坐标转换成away3d中的球体上的三维坐标。
问题总结:如何把屏幕坐标转换成空间中某个物体的坐标。
对于这个问题,根据屏幕坐标的来源可以规结为两种解决办法。
(1)点击事件产生的屏幕坐标,如空间中有一个球体sphere,为球体添加了一个mouseDown事件,在该事件的事件处理函数中转换。
this.group.addEventListener(MouseEvent3D.MOUSE_DOWN,MouseDown3D);
……
function MouseDown3D(e:MouseEvent3D):void
{
var vertex:Vertex=new Vertex(e.sceneX,e.sceneY,e.screenZ);
trace(vertex);
}
MouseEvent3D事件中保存了点击位置的屏幕坐标和球体上的三维坐标,MouseEvent3D的详细内容可以看away3d的帮助文档。
(2)对于屏幕上任意的一个点,要转换就要通过 HitManager来进行,其实MouseEvent3D事件中得到的三维坐标本质上也是根据HitManager得到的。
var session:AbstractSession=new SpriteSession();
view.hitManager.findHit(session as AbstractSession,screenX,screenY); //第一步
var even:MouseEvent3D=view.hitManager.getMouseEvent("click3d"); //第二步
trace(even.sceneX+","+even.sceneY+","+even.sceneZ+"***");
第一步:调用view中的hitManager的findHint方法。
第二步:调用hitManager的getMouseEvent方法得到一个保存了位置信息的MouseEvent3D变量。
如果查看HitManager类的源码就会发现,findHint方法的实现过程,其实是对view中所有的物体的三角形(3d世界中每个物体由很多个小三角形组成)进行扫描,找到第一个包含该屏幕点的三角形(因为我的view中只有一个球体,所以第一个找到的三角形肯定在我的球体上)。getMouseEvent方法, 只是把相关的位置信息封装成一个MouseEvent3D变量作为返回值而已。 |
|