• <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

            不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.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 閱讀(570) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 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類(lèi)中加入一個(gè)變量,用來(lái)表示寬高比

                  GLdouble m_aspectRatio; // width/height ratio

            2OnSize函數(shù)修改如下:

            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,繪制函數(shù)修改如下:

            void CCY457OpenGLView::RenderScene ()
            {
            //繪制函數(shù)
                  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,加入對(duì)鼠標(biāo)左鍵選擇物體的處理

            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/    

            本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
            原文鏈接:http://www.cnblogs.com/phinecos/archive/2008/11/07/1328861.html
            国产精品久久久久久福利漫画| 久久久久久无码Av成人影院| 国产精品久久久久久久久鸭| 国产91色综合久久免费| 久久久久国产精品| 日本精品久久久久久久久免费| 99久久这里只精品国产免费| 久久久久亚洲精品无码蜜桃| 国产 亚洲 欧美 另类 久久| 性高湖久久久久久久久AAAAA| 久久亚洲AV成人无码电影| 91亚洲国产成人久久精品网址| 中文精品99久久国产| 久久被窝电影亚洲爽爽爽| 伊人久久一区二区三区无码| 久久国产精品成人片免费| 伊人热热久久原色播放www| 97久久精品人人澡人人爽| 亚洲综合伊人久久综合| 色欲综合久久躁天天躁| 国产精品久久久久久| 精品国产乱码久久久久久呢| 精品国产综合区久久久久久| 国产亚洲欧美精品久久久 | 性欧美大战久久久久久久久| 伊人热人久久中文字幕| 色欲综合久久躁天天躁蜜桃| 亚洲欧美国产日韩综合久久| 久久久WWW免费人成精品| 亚洲国产天堂久久综合网站| 久久夜色精品国产噜噜噜亚洲AV| 日韩十八禁一区二区久久| 久久国产精品偷99| 伊人热人久久中文字幕| 91精品国产综合久久四虎久久无码一级| 少妇精品久久久一区二区三区| 亚洲综合久久久| 久久精品国产清自在天天线| 久久99热这里只频精品6| 久久人妻AV中文字幕| 伊人久久大香线蕉AV一区二区|