查看: 3565|回复: 0

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

[复制链接]

该用户从未签到

发表于 2008-5-1 19:01:51 | 显示全部楼层 |阅读模式
大家好,我做了一个外观上看上去像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
************************************************************/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表