总是不能正确的选定我想要的对象,我的程序是这样的:
void CLoadModelView::ProcessSelection(int x, int y)
{
GLuint selectBuff[512];
GLint hits, viewport[4];
memset(selectBuff, 0, sizeof(selectBuff)); glSelectBuffer(512, selectBuff);
glGetIntegerv(GL_VIEWPORT, viewport);

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glRenderMode(GL_SELECT);
glLoadIdentity();
gluPickMatrix(x, viewport[3]-y, 2, 2, viewport);
gluPerspective(45.0f,m_Aspect, .5f ,150.0f);

glMatrixMode(GL_MODELVIEW);
DrawScene();

hits = glRenderMode(GL_RENDER); glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);//下面是将所选定的对象名称在对话框中显示。
int i;
if(hits)
{
//Get Select Object i.
i = selectBuff[4];
CDlgProperty* dlgProperty = new CDlgProperty;
dlgProperty->m_pObject = &g_3DModel.pObject[i];
dlgProperty->DoModal();
delete dlgProperty;
}
}高手帮忙看一下呀!!!

解决方案 »

  1.   

    selectBuff[4]好象是你 push的第二层NAME,要么就是下一个命中的名字数
    如果你这个
    gluPerspective(45.0f,m_Aspect, .5f ,150.0f)
    和你在RENDER模式下绘制时不一样的话,有可能没反应,因为你显示出来的和你在缓冲区里绘制的区域不一样。
    另外请教你一下,怎么把SELECTBUFFER中的Z值换算成Z坐标值?
      

  2.   

    给你一段拾取数据的代码,希望对楼主有所帮助。//拾取操作由鼠标的LBUTTONDOWN消息触发
    void CDisplayView::OnButtonDown(UINT nFlags, CPoint point)
    {
        .............
        glGetIntegerv(GL_VIEWPORT, viewport); //得到当前视口
        w = viewport[2];
        w = viewport[3];
        glSelectBuffer(512, buf); //指定返回的选中记录所用的数组
        glRenderMode(GL_SELECT); //进入选择模式
        glInitNames(); //初始化名称栈
        glPushName(-1); //将-1压入栈
        
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        gluPickMatrix((GLdouble)x, (GLdouble)(viewport[3] - y),
           3.0, 3.0, viewport); //定义拾取矩阵    glMatrixMode(GL_MODELVIEW);    ..............
        //绘制场景并命名
        glLoadName(i); //给绘制的物体命名
        glCallList(i); //调用显示列表,绘制图元(i)    .........
        hits = glRenderMode(GL_RENDER); //退出选择模式
        //处理命中信息
        if(hits)
        {
            ResultName = GetSelectObject(buf, hits); //该函数返回命中图元的名称    ..............
        //改变该图元的显示,重新绘制
        ......................
        }
    }