一、对于选择的理解
有些图形应用程序只是简单地绘制静态的二维和三维物体图像。另外还有一些应用程序允许用户标识屏幕上的物体,并移动、更改或删除这些物体(或者进行其他操作)。由于在屏幕上所绘制的物体一般会经历多次旋转、移动和透视变换,因此在三维场景中判断用户所选择的是哪个物体是比较困难的。为了帮助你实现这个目的,OpenGL提供了选择机制,并使用一个特殊的工具函数,确定用户在某个区域中所指定的是哪个物体,或者允许用户通过光标进行挑选。
为了作用选择机制,需要执行下面这些步骤:
1.用glSelectBuffer()函数指定用于返回点击记录的数组;
2.用glRenderMode()指定GL_SELECT,进入选择模式;
3.使用glInitNames()和glPushName()对名字堆栈进行初始化;
4.定义用于选择的可视空间。通常,这个可视空间与最初用于绘制场景的可视空间不同,因此很可能需要用glPushMatrix()和glPopMatrix()函数保存和恢复当前的变换状态;
5.交替调用绘制图元的函数和操纵名字堆栈的函数,为每个相关的图元分配一个适当的名字;
6.退出选择模式,并处理返回的选择数据(点击记录);
可以使用选择模式来确定一个物体是否被挑选。为了实现这个目的,可以使用一个特殊的挑选矩阵,并协同使用投影矩阵,把绘图限制在视口的一个小区域内,一般是在靠近光标的位置。然后,允许某些形式的输入,例如点击鼠标按钮,对选择模式进行初始化。在确立了选择模式 并使用了特殊的接待矩阵之后,在靠近光标位置所绘制的物体就会导致选择点击。因此,接待一般是用于判断哪些物体是在靠近光标的位置绘制的。
二、对于选择特别注意问题
无论是在选择模式还是在反馈模式下,绘图信息总是返回到应用程序而不是像渲染模式那样发送到帧缓冲区。因此,在选择或反馈模式下,屏幕将被冻结,不会进行绘图。在这两种模式下,颜色、深度、模板和累积缓冲区的内容并不会受到影响。
一般情况下,当打算使用OpenGL的选择机制时,首先把整个场景绘制到帧缓冲区,然后进入选择模式,并对场景进行重绘。但是,当进入选择模式之后,帧缓冲区的内容将不会被修改,除非退出了选择模式。当退出选择模式时,OpenGL返回与可视空间相交的图元的列表,每个与可视空间的图元都会产生一个选择点击。
在选择模式下调用的绘图函数的绘图位置一定要与渲染模式下绘图函数的绘图位置一致。无论gluLookAt()是还是glTranslatef或glRotatef或glScalef,如果不是在绘图函数里面,都会对拾取产生影响,当在渲染模式下绘图位置与选择模式的绘图位置不同是,无法拾取。所以,要把这些变换函数放入绘图函数里面。