OpenGL中鼠标点取
(2008-07-27 00:29:19)
转载
class
class
LineSegment
//
GLdouble
GLdouble
GLint
glGetDoublev
glGetDoublev
glGetIntegerv
GLdouble
//
gluUnProject(
modelview,
&world_x,
Point3f
//
gluUnProject(
modelview,
&world_x,
Point3f
return
}
如果你是使用Win32平台进行开发,那么应当注意传入正确的参数.因为无论是使用Win32
我们可以看到代码被注释分为了三个部分:获取当前矩阵及视区,获取近裁剪面的交点,获取远裁剪面的交点.
我们通过OpenGL提供的查询函数轻松得到当前的ModelView和Projection矩阵,以及当前的Viewport(视区,也就是窗口的客户端区域,如果整个窗口区域用于OpenGL渲染的话).
获得两个裁剪面上的交点的代码基本上是一样的,唯一的不同点是我们前面曾经详细地讨论过的窗口的Z坐标.不错,这个坐标表示的就是"深浅"的概念.它的值从点P'到点P的变化是从0.0f逐渐增至1.0f.此处类似于OpenGL的深度测试机制.
在得到两个交点之后,我们使用它们通过返回语句直接构建一条线段.在这里仅仅作为实例代码,故简捷清晰地直接返回线段对象,而没有通过引用参数来提高效率.
此时用户可以使用这个函数来判断所选择的对象了.只需在需要的地方判断对象是否与此线段相交即可判断对象是否被选中,还可以通过进一步计算其交点位置来得到详细的交点信息.这些计算均是常见的计算机图形学与三维数学计算,比如线段与三角形求交,线段与面求交,线段与球体求交,线段与柱体或锥体求交,等等. 请参考所列出的计算机图形学书籍.
五,结论(Conclusion)
在本文中,我们介绍了一种行之有效的三维坐标拾取方法,主要使用GLU库中的实用工具实现.这种方法速度快,效率高,能在不必重新绘制对象的前提下完成拣选工作.对比OpenGL自带的拣选机制来看,RIP的确在各种方面均有一定的优势.
六,参考文献(Reference)
【1】《OpenGL
OpenGL
【2】《OpenGL
OpenGL
【3】《Computer
Donald
【4】《Computer
F.S.
Win32
OpenGL