小艾久久 发表于 2008-5-1 19:01:51

谢谢大家容忍我,问一个OpenGL拾取的问题

大家好,我做了一个外观上看上去像3Dmax的东东,可是在拾取的时候总是出现了问题,总是说,拾取的数量为零,快疯了,不知道怎么办,大家帮忙看看问题所在吧,如果您愿意,我可以把源代码给您,大家互相学习一下吧,请留下邮箱


这是一个MDI的程序,4个View都是别拆分窗口生成的。请大家帮忙看一下,下面具体的信息吧。
/*********************************************************
CView Start
*********************************************************/
// CView中的场景渲染函数
void CMy3DView::RenderScene(GLenum mode)
{
if( mode == GL_SELECT ){ // If we are in the select mode
glInitNames();
glPushName(-1);
}
this->_camera->LookAt();
this->GetDocument()->scene.RenderScene(mode);
}

// 在 mouseclient 的 cpp 中实现了 PICK 的函数, 当 CView的捕获到鼠标右键的时候,便会激活mouseclient的PICK
CMy3DView::OnLButtonDown(UINT nFlags, CPoint point)
{
      // TODO: Add your message handler code here and/or call default
      m_active = this->id;
      this->UpDataMouseClient();
      _MouseClient->OnLButtonDown(nFlags, point.x, point.y);
      this->_frame->UpDataAllViews();
      CView::OnLButtonDown(nFlags, point);
}
/*************************************************************
CView end
*************************************************************/

/************************************************************
Scene and Polyhedron begin
************************************************************/
// _array_element 是一个多面体的容器,多面体从Element继承,一个抽象类
void Scene::RenderScene(GLenum mode){

glCallList(m_grid_dl);
int size = this->_array_element.size();
for(int i=0;i<size;i++)
_array_element->DrawSelf(mode);
}
void Polyhedron::DoDraw(GLenum mode)
{
map<int,polygon*>::iterator begin = this->_map_polygon.begin();
map<int,polygon*>::iterator end = this->_map_polygon.end();
if( mode == GL_SELECT )
glLoadName(_id); //Here I Load the name
for(;begin!=end;begin++)
(*begin).second->DoDraw(mode);
}

/***********************************************************
Scene end
************************************************************/



/***********************************************************
MouseClient begine
************************************************************/
void MouseClient::OnLButtonDown(unsigned int nFlags, float x, float y)
{
this->Pick( (int)x, (int)y);
}
void MouseClient::Pick(int x,int y)
{
if(!this->_view)
return;
GLuint selectBuff;

GLint hits, viewport;

glSelectBuffer(64, selectBuff);

glGetIntegerv(GL_VIEWPORT, viewport);

glMatrixMode(GL_PROJECTION);

glPushMatrix();
glRenderMode(GL_SELECT);

glLoadIdentity();
gluPickMatrix( x, viewport - y, 2,2, viewport);

float cx = _view->m_viewPort.cx;
float cy = _view->m_viewPort.cy;
gluPerspective(45.0f, cx/cy, .01f, 200.0f);

this->_view->RenderScene(GL_SELECT);

// 问题
/******** PROBLEM HERE **********/
int hit = glRenderMode(GL_RENDER);


int index = selectBuff;

glMatrixMode(GL_PROJECTION);

glPopMatrix();

glMatrixMode(GL_MODELVIEW);
}

/***********************************************************
MouseClient end
************************************************************/
页: [1]
查看完整版本: 谢谢大家容忍我,问一个OpenGL拾取的问题