《OpenGL 2.0 精髓》书中有一个例程,网上可以搜索到电子书以及源代码的。
具体的应用可以参考下例,将屏幕坐标(mouseX, MouseY)转化为模型空间坐标。
注意:操作的时候应该点击屏幕中模型显示的地方,否则转化后的结果
//拾取操作,鼠标点的坐标保存在全局变量mouseX, MouseY
//在场景全部绘制完毕之后处理拾取,而且读取后缓冲,结果存放与ox, oy, oz中。
GLdouble ox = 0, oy = 0, oz = 0;
GLubyte mouseColor[3] = {0};
void ProcessPick(int mouseX, int mouseY)
{
glReadBuffer(GL_BACK);
GLint Viewport[4];
glGetIntegerv(GL_VIEWPORT, Viewport);
float fZValue = 0;
glReadPixels(mouseX,Viewport[3]-mouseY, // 屏幕坐标
1,1, //宽高都为1,即只读一个象素
GL_DEPTH_COMPONENT, //希望获得深度信息
GL_FLOAT, //浮点型
&fZValue ); //获得值保存在fZValue中 得到一个0~1之间的数
GLdouble ModelMatrix[16], ProjMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, ModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, ProjMatrix);
gluUnProject(mouseX, Viewport[3]-mouseY,
fZValue, ModelMatrix, ProjMatrix, Viewport,
&ox, &oy, &oz);
glReadPixels(mouseX,Viewport[3]-mouseY,1, 1, GL_RGB,
GL_UNSIGNED_BYTE, mouseColor);
}
仅供参考
[ 本帖最后由 tan_dunming 于 2008-11-5 08:29 AM 编辑 ] |