|
大家好,我做了一个外观上看上去像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:oDraw(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->ick( (int)x, (int)y);
}
void MouseClient:ick(int x,int y)
{
if(!this->_view)
return;
GLuint selectBuff[64];
GLint hits, viewport[4];
glSelectBuffer(64, selectBuff);
glGetIntegerv(GL_VIEWPORT, viewport);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glRenderMode(GL_SELECT);
glLoadIdentity();
gluPickMatrix( x, viewport[3] - 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[2];
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
/***********************************************************
MouseClient end
************************************************************/ |
|