摘 要:基于OpenGL提出了一种重绘式拾取法,详细介绍了拾取方法和具体应用。该方法是在原来的绘图过程中添加一次虚拟绘图来帮助拾取物体。
关键词:OpenGL 拾取 点云
OpenGL作为一个性能优越的图形应用程序设计界面而广泛应用于科学计算可视化、CAD/CAM、仿真、虚拟现实(VR)等领域。其中物体的拾取属于OpenGL中人机实时交互技术的一部分。它是由操作者通过输入设备输入相应信息,来选取屏幕所显示的物体。
拾取是计算机图形处理系统中的一个重要功能。在许多情况下,不仅要绘制图形,而且允许操作者能够通过输入设备操纵屏幕上的物体。有时还需要获取物体的空间坐标或图形数值,所有这些都要以拾取作为实现的基础。在使用OpenGL工具包开发图形处理系统时,物体的拾取有多种方法,其中包括OpenGL提供的选择机制、射线拾取法(raypicking)等。作者在开发三维图形处理系统,实现大量三维点(点云)的框选功能时,发现OpenGL提供的选择机制有其自身的缺陷,而射线拾取法又会涉及到过于复杂的算法。为此研究出一种易于实现、适应性强的物体拾取方法——重绘式拾取法。
1 拾取方法综述
1.1 OpenGL选择机制
OpenGL为了解决拾取问题,提供了一种基于名字堆栈和命中记录的选择机制。但是,这种机制使用限制较多,其拾取最小单位是图元,而不是空间点,且对于数据量较大的物体会因为名字堆栈的溢出而无法成功实现。另外,OpenGL的选择机制使用起来比较麻烦,需要在正常模式和选择模式之间进行切换。
1.2 射线拾取法
射线拾取法是通过获取鼠标在屏幕上的点击点,经屏幕坐标转换得到投影点,以视点为起点,经投影点构造一条垂直指向屏幕的射线。由于所有物体都位于视锥之内,因而只需判断这条射线与场景中的哪些物体相交,经过选择即可获取所需要物体。
将这种方法应用于点云的框选时,则需要将屏幕上的n个点击点所对应的n条射线构成一个选择体。然后,通过算法来对每个点进行处理判断,在选择体内部的点就是所要拾取的点。
这种方法的缺点是,对于复杂的选择体,判断物体是否在选择体内部的算法极其复杂。从而使整个处理过程耗时巨大,且如此复杂的算法也会给整个系统的实现带来一定难度。
1.3 对象缓冲区的拾取方法
对象缓冲区的拾取方法需要在内存中创建对象缓冲区,且需要对内存进行大量操作,因而降低了效率。而重绘式拾取法则不需进行屏幕数据的读取和拷贝。
1.4 重绘式拾取法
重绘式拾取法避免了前述方法的缺点。其优点:(1)没有采用OpenGL选择机制。整个拾取过程都在OpenGL的绘图模式下完成,因此不必要为每个物体命名。同时,避免了在绘图模式与选择模式之间的切换。(2)这种方法在框选时,选择框可以是方形、圆形等各种自定义形状,并且此方法容易实现,不会涉及到复杂算法。
2 重绘式拾取法
2.1 基本思路
重绘式拾取法是在OpenGL绘图模式下,通过2次绘图来拾取并显示物体。第1次绘图为虚拟绘图,通过在OpenGL帧缓存中绘制一些辅助图形来帮助选取物体。这些辅助图形对于系统使用者是不可见的,因此在确定所选物体之后要将辅助图形从帧缓存中清除掉才能进行第2次绘图。第2次绘图为实际绘图,所绘图形为系统使用者看到的真实图形。
这种拾取方法的过程如下:(1)进入虚拟绘图过程,绘制辅助图形。根据不同的应用,可以使用不同的辅助图形。(2)从辅助图形得出相应信息,搜索出所要拾取的物体。(3)进入真实绘图过程,清除辅助图形,设置背景颜色,绘制真实图形。在不需要拾取物体的时候,不必执行虚拟绘图过程,直接执行步骤(3)进入真实绘图过程即可。
此种拾取方法与前述的几种拾取方法也有相通之处。与OpenGL的选择机制对比,这种方法虽然没有进入选择模式建立名字堆栈,但在实际应用中,常会利用不同的颜色值来对物体进行区分,其虚拟绘图过程相当于OpenGL的选择模式。射线拾取法是通过复杂的算法来确定物体与选择体之间的空间位置关系,从而选取相应的物体。而这种重绘式拾取法则将确定空间位置关系的工作交给了OpenGL,通过辅助图形和OpenGL提供的函数来选择相应的物体。
2.2 辅助图形
此方法的第一步虚拟绘图的主要工作就是要绘制辅助图形。辅助图形通常是借助颜色来分辨选中的物体和未被选中的物体。如在点云的框选中,可以将选择区域涂成白色,将未被选择的区域(背景)涂成黑色,白色区域中的点即是所要选择的点。整个白色的选择区域就是在虚拟绘图中所要绘制的辅助图形。
辅助图形是整个重绘式拾取法的核心。对不同的拾取要求(如点的框选或者是大物体的点选等),辅助图形各不相同。辅助图形的选择决定了拾取功能实现的成功与否。
2.3 搜索物体
此方法的第二步是搜索物体,它需要根据一些信息来对所有物体进行遍历。目前都是通过颜色信息来确定被选物体。如在点云的框选中,就需要遍历所有的点,其所在位置的颜色就是决定其是否被选中的依据。
3 应 用
这种重绘式拾取方法在作者自行开发的图形处理系统中已经得到了应用。下面用实例来介绍这种拾取方法的实现过程。
作者的图形处理系统是根据大量的三维点(点云)进行曲面重构。其中点的拾取是必不可少的。重绘式的拾取方法极其适合点云的框选。其具体处理过程如下。
(1)绘制辅助图形。此辅助图形为输入设备所提供的选择框,且选择框的形状可任意。选择框的内部填充为白色。
(2)确定选择框内部的三维点。通过判断三维点所在位置的屏幕颜色来判断此点是否为被选点。被选择的点位于选择框之内,其颜色值应为选择框的颜色(白色)。没被选中的点位于选择框之外,其颜色值应为背景的颜色(黑色)。
这个过程用到的2个关键OpenGL API函数是glReadPixels与gluProject。首先,用函数glReadPixels读取帧缓存中的象素值。然后用函数gluProject将所有点的三维坐标转换成点在帧缓存中的位移,由这些位移便可以得到每个点在帧缓存中的象素值,从而可以判断出哪些三维点为选中点。
注意,函数glReadPixels只能读取帧缓存的象素值,捕获不到显示窗口外的象素点。因此,当选择框超过当前窗口的大小时,则需要将坐标系进行缩放,使得选择框能够在当前窗口中全部显示。此外,绘图过程中要使用OpenGL的平坦模式,并且要关闭灯光和颜色抖动,否则将干扰选择程序进行正确的选择。
(3)清除辅助图形,绘制真实图形。可使用OpenGL的函数glClear清空屏幕和深度缓存,从而清除掉白色实心的选择体。
图1为作者开发的软件在框选点之前的截图。图2为框选点之后的截图,图中有4万个三维点(有很多重合点)。在框选时,拾取速度很快且没有闪屏和漏选的现象。图2中白色框为选择框,图中的点为选中的点。
4 展 望
以上所讲的只是重绘式拾取法的一个实例,对于其他的拾取情况,可以采取不同的辅助图形和筛选方法来拾取物体,甚至可以利用光照、颜色抖动、材质等各种OpenGL提供的绘图环境来达到目的。但是这些技术还需要进一步的研究和开发。
参考文献
1 Wright R S,Sweet J M.OpenGL超级宝典.北京:人民邮电 出版社,2000
2 Heran D,Baker M P.计算机图形学.北京:清华大学出版社,1998
3 乔林,费广正.OpenGL程序设计.北京:清华大学出版社, 2000
4 白燕斌,史惠康.OpenGL三维图形编程指南.北京:机械工 业出版社,1998