away3d版本:3.6.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变量作为返回值而已。

原始出处:http://www.cnblogs.com/jdksummer/articles/2599036.html