纳金网

标题: away3d(3.6.0)屏幕坐标到三维坐标的转换 [打印本页]

作者: yeu1233    时间: 2012-9-4 10:43
标题: 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://go.narkii.com/club/) Powered by Discuz! X2.5