用OpenGL实现射线拣取对象

本文介绍了如何在OpenGL中实现射线拣取对象,通过屏幕坐标到三维世界空间坐标的转化,然后利用射线与三角形求交点的算法进行拣取。详细讲解了OpenGL下的射线拣取步骤,并提供了伪码实现和源码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:
  
   用OpenGL实现射线拣取对象
  关于用射线原理来拣取对象网上已经有完整的理论,另外DirectX也提供了一个Pick例子来演示,在这里我将这些资料和理论来稍微的总结,并给出OpenGL下的完整实现。
  相关的理论大体来自一篇英文资料和一篇总结性的中文资料,分别是:
  http://www.gameres.com/Articles/Program/Visual/3D/pick_2004_529.htm
  http://www.mvps.org/directx/articles/rayproj.htm
  前一篇完整讲述用DirectX实现射线拣取物体的原理和实现。后一篇讲述的是二维屏幕空间到三维世界空间的转换原理。前一篇的名字是“Direct3D中实现图元的鼠标拾取”,它的讲述很好也很透彻。后一篇讲述射线形成的原理,并且有源码例子。
  下面就OpenGL进行实现。
  第一步:
  实现屏幕坐标到三维世界空间坐标的转化,在这一步Opengl要比DirectX简单的多,利用函数 gluUnProject直接可以得到屏幕坐标相应的三维空间坐标,示例如下:
  gluUnProject((GLdouble)xpos,(GLdouble)ypos,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz); xpos 和ypos 是以屏幕左下角为原点的屏幕坐标,1.0代表返回zbuffer为1.0处(远剪切面交点)的世界坐标,mvmatrix 为视矩阵,通过GetDoublev(GL_MODELVIEW_MATRIX,mvmatrix)得到,projmatrix为投影矩阵,通过glGetDoublev(GL_PROJECTION_MATRIX,projmatrix)得到,viewport为视口,通过glGetIntegerv(GL_VIEWPORT,viewport)得到,剩下的wx、wy、wz 就是我们要得到的世界坐标,得到这样两个世界坐标,射线就确定了,或者也可以用原点(视点)来代替其中一个点,因为这条射线是从视点出发的。
  第二步:
  用射线和要检测的三角形求交点,用到的原理和公式如下。
  原理一:三角形内的任意一点都可以用变量u、v和其三个顶点坐标来确定,其中0
  原理二:射线上的任意一点可以用射线的方向向量(格式化后的)乘以其模(该向量长度)来表示,记为:vPoint =originPoint+dir * len
  如果和三角形相交则必定同时满足上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值