查看: 2953|回复: 0
打印 上一主题 下一主题

away3d(3.6.0)屏幕坐标到三维坐标的转换

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-9-4 10:43:37 |只看该作者 |倒序浏览
项目需求: 空间中有一个球体,球体在视窗内显示时并不是全部显示,每次只显示球体的一部分,现在需要在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变量作为返回值而已。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-22 03:33 , Processed in 0.083003 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部