opengl es的射线拾取

       在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卷》的第九章,讲的很精彩。

相关文章
相关标签/搜索