我要发帖 回复

正式会员

3

主题

54

积分

0

专家分

:

私信
发表时间 : 2008-5-20 18:30:55 | 浏览 : 2135    评论 : 5
浮动窗口是建立在MFC单文挡基础上的OpenGL场景,
我想在子视图(浮动窗口)CChildOGLView为俯视,
通过鼠标拾取一个正方体的box,然后进行平移等动作控制在主视图上同步显示.
现在问题是不知道如何才能实现在子视图(浮动窗口)CChildOGLView鼠标拾取?
谢谢!!

最近VR访客

tan_dunming 评论于2008-5-20 20:58:15
glViewPort设置好视口参数的话和普通的拾取不一样的吗?
追求卓越
lienay 评论于2008-5-20 22:41:44
我在浮动窗口CChildOGLView中绘图代码如下:
void CChildOGLView::DrawScene()
{

        ViewType currentviewtype;
        CMainFrame* pframe = (CMainFrame*)AfxGetMainWnd();
        currentviewtype = pframe->m_ViewArrange.m_ChildViewAType;

        ////////////////////////////////////////////////Open  double buffer
        static BOOL   bBusy = FALSE;
        if(bBusy)  return;
        bBusy =TRUE;

        glClearColor(0.0f,0.5f,0.8f,1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
    gluLookAt(0.0,20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -20.0);

    glPushMatrix();
        CView2Doc* pdoc = GetDocument();
        if(pdoc != NULL)
        {
               
        pdoc->m_3DObject.DrawGL3D();
               
        }
glPopMatrix();
        glFinish();
        SwapBuffers(wglGetCurrentDC());
        bBusy = FALSE;
        ///////////////////////////////////////////////

}


void CChildOGLView::OnLButtonDown(UINT nFlags, CPoint point)
{
        // TODO: Add your message handler code here and/or call default
       
        ProcessSelection(point);

        CFormView::OnLButtonDown(nFlags, point);
}



void CChildOGLView::ProcessSelection(CPoint point)
{
        int xPos = point.x ;
        int yPos = point.y ;

        GLuint selectBuff[64];

        GLint hits, viewport[4];

        glSelectBuffer(64, selectBuff);

        glGetIntegerv(GL_VIEWPORT, viewport);

        glMatrixMode(GL_PROJECTION);

        glPushMatrix();
        glRenderMode(GL_SELECT);

        glLoadIdentity();
        gluPickMatrix(xPos, viewport[3] - yPos, 2,2, viewport);

       
        hits = glRenderMode(GL_RENDER);

        DrawScene();
       
        glMatrixMode(GL_PROJECTION);

        glPopMatrix();


        if(hits==1)

                ProcessObject(selectBuff);
                     

        glMatrixMode(GL_MODELVIEW);

}

void CChildOGLView::ProcessObject(GLuint *pSelectBuff)
{
        int id = pSelectBuff[3];

        if(id==1)
                MessageBox("You clicked on Sphere");
       

}

另在建了一个CMyObject的类中

void CMyObject::DrawGL3D()
{

            glPushMatrix();
              land();
                glPopMatrix();

              glInitNames();
              glPushName(0);
                glPushMatrix();
                glLoadName(1);
      
                glColor3f(1.0f,0.0f,1.0f);
                glTranslatef(-0.5f,1.0f,-0.5f);
               glutSolidCube(1.0f);
                glPopMatrix();
}
lienay 评论于2008-5-20 22:46:13
点击选择的时候在CChildOGLView窗口里没弹出消息框,没反应.
不知道是哪里出了问题.?
谢谢
tan_dunming 评论于2008-5-21 09:14:18
在 void CChildOGLView::ProcessSelection(CPoint point)函数中

        glRenderMode(GL_SELECT)
        glLoadIdentity();
        gluPickMatrix(xPos, viewport[3] - yPos, 2,2, viewport);   
        hits = glRenderMode(GL_RENDER);

        DrawScene();
DrawScene应该在glRenderMode()的GL_SELECT和GL_RENDER之间调用。
建议你再找本书好好看看拾取步骤,结合例程看看有无其它问题。

[ 本帖最后由 tan_dunming 于 2008-5-21 09:16 AM 编辑 ]
追求卓越
lienay 评论于2008-5-21 10:05:17
好,谢谢斑竹!

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-6-12 07:18 PM

返回顶部