Away3D学习笔记-空间点捕捉
2010-12-05 22:59
316 查看
项目的基本技术要求,就是能捕捉用户在舞台上点击的3D坐标。
首先这涉及侦听MouseDown事件,如果Scene来侦听,当舞台上没东西时,是不会触发鼠标事件的,因此只能用Stage来侦听,而stage侦听的鼠标坐标是舞台的相对坐标,这里就需要一系列换算。
基本思路就是:将舞台坐标先换算为View3D的坐标,再通过Camera与该点的连线与坐标平面相交来计算点。
舞台坐标换View坐标可以以View的MouseX,MouseY属性为参数,调用Camera的unproject来计算。计算相交这部分代码不用自己写,Away3D的Plane3D对象封装了相关函数。因此代码很简洁:
然后我试图从坐标原点画一条线到鼠标点击位置:
View.hitManage用于获取当前点击的一系列属性,类似于MouseEvent3D对象,用于非MouseEvent3D事件。上面两行代码第一行获取法向量,第二行获取被点击面上的一个点,v0是vertexs类,position是vector3D类。
首先这涉及侦听MouseDown事件,如果Scene来侦听,当舞台上没东西时,是不会触发鼠标事件的,因此只能用Stage来侦听,而stage侦听的鼠标坐标是舞台的相对坐标,这里就需要一系列换算。
基本思路就是:将舞台坐标先换算为View3D的坐标,再通过Camera与该点的连线与坐标平面相交来计算点。
舞台坐标换View坐标可以以View的MouseX,MouseY属性为参数,调用Camera的unproject来计算。计算相交这部分代码不用自己写,Away3D的Plane3D对象封装了相关函数。因此代码很简洁:
fromNormalAndPoint是创建一个虚拟平面,第一个参数是平面法向,(0,0,-1)就是面向屏幕的面,第二个参数是平面上一点,直接默认在零点即可。 camera.unproject是调用Camera对象的投影方法得到一个坐标值,但这个值是相对于Camera的坐标,所以再加上Camera的坐标就成了绝对坐标。 pl.getIntersectionLineNumbers,函数名字有点长:(,参数是两个点,两点确定一条直线,返回的就是虚拟平面上的点了。 还有一种简单粗暴但有效的办法确定点,那就是创建一个真实的平面做坐标平面,然后监听平面的MouseDown事件,通过事件参数里的SceneX,SceneY,SceneZ来得到空间坐标,这种办法绝对不会错,唯一的问题就是如果平面被别的物体挡住了,MouseDown事件就失效了。 通过实验比较发现,这两种办法确定下来的点的坐标很相似,但后者正好比前者的坐标大了整1.2倍。造成这个诡异误差的原因不明,所以只好手工把前者产生的坐标扩大1.2倍使用了。 p.scaleBy(1.2);
然后我试图从坐标原点画一条线到鼠标点击位置:
focus,zoom值继续实验。发现引起误差的原因来自于focus值,解决办法是让focus无限接近0,为了弥补focus过小导致物体太远,再把zoom放大相应倍数。Away3D里focus默认是100,zoom默认是10。这里我设focus为0.1,zoom就是10000。 在实际应用中,要获得某个物体的某个面上的点除了用传统的监听MouseDown外,也可以利用直线和面交点的办法,在创建Plane3D对象时,将物体上某个面的法向量和一个点作为参数。法向量和点用如下方法获取: view.hitManager.elementVO as FaceVO).face.normal; view.hitManager.elementVO as FaceVO).face.v0.position;
View.hitManage用于获取当前点击的一系列属性,类似于MouseEvent3D对象,用于非MouseEvent3D事件。上面两行代码第一行获取法向量,第二行获取被点击面上的一个点,v0是vertexs类,position是vector3D类。
相关文章推荐
- LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间
- NVIDIA JETSON Tk1的学习笔记一(释放存储空间)
- C#回顾学习笔记二十四:命名空间
- opencv学习笔记(颜色空间)
- C++ Primer 学习笔记:using 命名空间
- C++学习笔记(九):作用域和命名空间
- Linux基础学习笔记之硬盘空间计量单位换算与计算机数据计量单位换算区别
- XML学习笔记(一):XML中的命名空间
- C++学习笔记(7)动态内存&命名空间
- opencv学习笔记(一):基于YCrCb颜色空间的肤色检测
- python学习笔记——模块和命名空间
- C++ Primer 学习笔记_92_用来大型程序的工具 -命名空间[续1]
- oracle 11g 学习笔记 10_31_管理表空间和数据文件
- shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)
- Away3d学习笔记 - away3d类库下载
- Directshow(SDK)学习笔记九_视频捕捉
- Unity3D之空间转换学习笔记(二):基础数学
- STL学习笔记之空间配置器
- php命名空间学习笔记。
- ORACLE DBA学习笔记--撤消表空间的管理