总是不能正确的选定我想要的对象,我的程序是这样的:
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;
}
}高手帮忙看一下呀!!!
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;
}
}高手帮忙看一下呀!!!
如果你这个
gluPerspective(45.0f,m_Aspect, .5f ,150.0f)
和你在RENDER模式下绘制时不一样的话,有可能没反应,因为你显示出来的和你在缓冲区里绘制的区域不一样。
另外请教你一下,怎么把SELECTBUFFER中的Z值换算成Z坐标值?
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); //该函数返回命中图元的名称 ..............
//改变该图元的显示,重新绘制
......................
}
}