}
}
voidProcessSelection(intx,inty)
{
GLintviewport[4],hits;
staticGLuintselectBuffer[BUFFER_LENGTH];
//设置选择缓冲区
glSelectBuffer(BUFFER_LENGTH,selectBuffer);
//切换到投影矩阵,我们需要创建可视区域
glMatrixMode(GL_PROJECTION);
//保留原先的投影矩阵,以便恢复
glPushMatrix();
glLoadIdentity();
//获得视口
glGetIntegerv(GL_VIEWPORT,viewport);
//切换到选择模式
glRenderMode(GL_SELECT);
GLfloataspect=(GLfloat)viewport[2]/(GLfloat)viewport[3];
//创建一个描述可视区域的矩阵
gluPickMatrix(x,viewport[3]-y+viewport[1],2,2,viewport);
//与投影矩阵相乘,得到可视区域
gluPerspective(35.0,aspect,1.0,200.0);
//在选择模式下渲染图元
RenderSphere();
//返回点击记录数。
hits=glRenderMode(GL_RENDER);
ProcessHit(hits,selectBuffer);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
当我只选择太阳时:

只有一个点击记录,一个物体在选择的可视区域内输出如下:

当太阳和地球重叠,然后我点击地球时:

有两个点击记录 输出如下:

OpenGL超级宝典 第4版 中文版PDF+英文版+源代码 见
OpenGL编程指南(原书第7版)中文扫描版PDF 下载
OpenGL 渲染篇
Ubuntu 13.04 安装 OpenGL
OpenGL三维球体数据生成与绘制【附源码】
Ubuntu下OpenGL编程基础解析
如何在Ubuntu使用eclipse for c++配置OpenGL
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30673-4.html
还是14度16度的橙色喝着爽