opengl es的射线拾取
opengl es的射线拾取
流云1987 发表于12个月前
opengl es的射线拾取
  • 发表于 12个月前
  • 阅读 79
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 在opengl中,物体显示在屏幕上,是经过一系列的坐标变换后才显示出来的,也就是说物体在屏幕上的坐标和物体自己原本的坐标根本就不是一回事。那如果用户在屏幕上手动的选择一个物体,然后再拖动这个物体,那该怎么办呢?

       在opengl中关于拾取有封装好的选择模式,名字栈,命中记录,实现拾取的功能,相对容易一些。但是到了opengl es里面就比较倒霉了,因为opengl es是opengl的简化版,很多功能都被去掉了。没办法,要想实现拾取的功能只有自己动手。目前比较成熟而且相对较简单的拾取方案是:射线相交拾取。

      先介绍一下射线相交拾取的原理:

      (1):将用户在屏幕上点击的坐标(X, Y),转换为归一化坐标(Xn, Yn)

      (2):考虑到透视投影的可视锥有一个近平面和一个远平面,所以可以将刚才的归一化坐标转换为两个归一化坐标,一个的z值在近平面上,z值为-1;另一个的z值在远平面上,z值为1

      (3):计算出透视投影的逆矩阵,用这个逆矩阵分别乘以两个归一化坐标,相乘之后得到的值分别除以w,也就是做透视除法,这样就得到了在虚拟空间中的两个点。

      (4):用上一步计算出的虚拟空间中的两个点,生成一条射线。

      (5):用这条射线和其他的物体做相交检测。为了便于检测,可以将要检测的物体当成一个球体,这样射线和球体之间是否相交就比较容易检测了。

 

原本想自己在这篇博客中,将所有的步骤都讲的详细透彻,但是,真正动手才发现自己水平不够。既然这样就向大家推荐一处好的资料吧,《opengl es应用开发实践指南 android卷》的第九章,讲的很精彩。

 

     

 

共有 人打赏支持
粉丝 1
博文 8
码字总数 5512
×
流云1987
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: