• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Shuffy

            不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19

            《基于MFC的OpenGL編程》Part 15 Selection

            Posted on 2010-03-31 20:50 Shuffy 閱讀(558) 評論(0)  編輯 收藏 引用 所屬分類: MFC,OpenGL

            Selection

            Selection is a powerful feature of OpenGL that allows you click at some position of the OpenGL window using the mouse and determine which of your objects lie beneath it. The act of selecting a specific object is called Picking. With OpenGL's selection feature, we can specify a viewing volume and determine which objects fall within that viewing volume. A powerful utility function, gluPickMatrix, produces a matrix which can be used to create a smaller viewing volume placed beneath the mouse cursor. Then we use selection to test this viewing volume to see which objects are contained by it.

            Selection is actually a rendering mode, but in this mode no pisels are actually copied onto the frame buffer. Instead, primitives drawn within the viewing volume produce hit records in a selection buffer. We must set up this selection buffer in advance and name the primitives or groups of primitives so that they can be identified in the selection buffer.We can then parse the buffer to determine which objects intersected the viewing volume.

            Naming Primitives

            We have to name a group of primitives such as one describing a cube or a cylinder etc in order to identify them. These names are nothing but integers such as for display list names. The names list is maintained on the named stack. After we initialize the name stack we can push names on the stack or simply replace the name currently on the top of the stack. When a hit occurs during selection, all the names on the stack are copied onto the selection buffer.

            1,CCY457OpenGLView類中加入一個變量,用來表示寬高比

                  GLdouble m_aspectRatio; // width/height ratio

            2OnSize函數修改如下:

            void CCY457OpenGLView::OnSize(UINT nType, int cx, int cy)
            {
                  CView::OnSize(nType, cx, cy);
                  
            if ( 0 >= cx || 0 >= cy )
                  {
                       
            return;
                  }
                  
            // select the full client area
                ::glViewport(00, cx, cy);
                  
            // compute the aspect ratio
                  
            // this will keep all dimension scales equal
                  m_aspectRatio = (GLdouble)cx/(GLdouble)cy;
                  
            // select the projection matrix and clear it
                ::glMatrixMode(GL_PROJECTION);
                ::glLoadIdentity();
                  
            // select the viewing volume
                  ::gluPerspective(45.0f, m_aspectRatio, .01f, 200.0f);
                  
            //::gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f);   
                  
            // switch back to the modelview matrix and clear it
                ::glMatrixMode(GL_MODELVIEW);
                ::glLoadIdentity();
            }

            3,繪制函數修改如下:

            void CCY457OpenGLView::RenderScene ()
            {
            //繪制函數
                  glTranslatef(0.0f,0.0f,-5.0f);
                  glRotatef(m_xRot,
            1.0f,0.0f,0.0f);
                  glRotatef(m_yRot,
            0.0f,1.0f,0.0f);
                  glInitNames();
                  glPushName(
            0);
                  glPushMatrix();
                       glTranslatef(
            -2.0f,0.0f,0.0f);
                       glLoadName(
            1);
                       glutSolidSphere(
            1.0f,20,20);
                  glPopMatrix();
                  glPushMatrix();
                       glLoadName(
            2);
                       glTranslatef(
            2.0f,0.0f,0.0f);
                       glutSolidCube(
            1.0f);
                  glPopMatrix();
            }

            4,加入對鼠標左鍵選擇物體的處理

            void CCY457OpenGLView::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);
                  gluPerspective(
            45.0f, m_aspectRatio, .01f, 200.0f);
                  RenderScene();
                  hits 
            = glRenderMode(GL_RENDER);
                  
            if(hits==1)
                       ProcessObject(selectBuff);
                  glMatrixMode(GL_PROJECTION);
                  glPopMatrix();
                  glMatrixMode(GL_MODELVIEW);
            }
            void CCY457OpenGLView::ProcessObject (GLuint* pSelectBuff)
            {
                  
            int id = pSelectBuff[3];
                  
            if(id==1)
                       MessageBox(
            "You clicked on Sphere");
                  
            if(id==2)
                       MessageBox(
            "You clicked on Cube");
            }
            void CCY457OpenGLView::OnLButtonDown(UINT nFlags, CPoint point)
            {
                  ProcessSelection(point);
                  CView::OnLButtonDown(nFlags, point);
            }

            作者:洞庭散人

            出處:http://phinecos.cnblogs.com/    

            本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
            原文鏈接:http://www.cnblogs.com/phinecos/archive/2008/11/07/1328861.html
            久久精品国产99国产精品亚洲 | 国产高潮国产高潮久久久91 | 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 色欲综合久久中文字幕网| 精品国产乱码久久久久久呢| 久久精品国产亚洲av麻豆色欲| 久久最新精品国产| 亚洲日韩中文无码久久| 伊人色综合久久| 久久精品桃花综合| 国产精品永久久久久久久久久| 18禁黄久久久AAA片| 国产精品久久网| 久久久一本精品99久久精品66 | 久久久久无码精品| AV狠狠色丁香婷婷综合久久 | 久久精品一区二区影院| 久久久久无码精品国产| 久久夜色精品国产噜噜亚洲a| 国产成人精品久久二区二区| 久久久久波多野结衣高潮| 国产免费久久精品丫丫| 久久精品国产91久久综合麻豆自制| 久久这里只有精品首页| 欧美一级久久久久久久大片| 久久se精品一区精品二区| AAA级久久久精品无码片| 久久久国产精品亚洲一区| 久久久久人妻一区二区三区vr| yy6080久久| 久久久精品国产免大香伊 | AV无码久久久久不卡网站下载| 成人综合久久精品色婷婷| 久久综合精品国产一区二区三区 | 国产V综合V亚洲欧美久久| 久久国产亚洲精品无码| 99久久精品国产麻豆| 久久精品天天中文字幕人妻| 99久久精品国产麻豆| 久久AⅤ人妻少妇嫩草影院| 99热精品久久只有精品|