在opengl中关于拾取有封装好的选择模式,名字栈,命中记录,实现拾取的功能,相对容易一些。可是到了opengl es里面就比较倒霉了,由于opengl es是opengl的简化版,不少功能都被去掉了。没办法,要想实现拾取的功能只有本身动手。目前比较成熟并且相对较简单的拾取方案是:射线相交拾取。android
先介绍一下射线相交拾取的原理:开发
(1):将用户在屏幕上点击的坐标(X, Y),转换为归一化坐标(Xn, Yn)博客
(2):考虑到透视投影的可视锥有一个近平面和一个远平面,因此能够将刚才的归一化坐标转换为两个归一化坐标,一个的z值在近平面上,z值为-1;另外一个的z值在远平面上,z值为1原理
(3):计算出透视投影的逆矩阵,用这个逆矩阵分别乘以两个归一化坐标,相乘以后获得的值分别除以w,也就是作透视除法,这样就获得了在虚拟空间中的两个点。opengl
(4):用上一步计算出的虚拟空间中的两个点,生成一条射线。生成
(5):用这条射线和其余的物体作相交检测。为了便于检测,能够将要检测的物体当成一个球体,这样射线和球体之间是否相交就比较容易检测了。封装
本来想本身在这篇博客中,将全部的步骤都讲的详细透彻,可是,真正动手才发现本身水平不够。既然这样就向你们推荐一处好的资料吧,《opengl es应用开发实践指南 android卷》的第九章,讲的很精彩。