Click here to Skip to main content
11,639,554 members (62,823 online)
Click here to Skip to main content

How to select an object using OpenGL

, 29 Oct 2003 CPOL 124.6K 7.2K 50
Rate this:
Please Sign up or sign in to vote.
This article explains how to select an object using OpenGL.

Sample Image

Introduction

I am Vietnamese and my English is not good. But I hope you will understand my article. I tried to write a game as my project in school. I decided to write it using 3D technique, and I used OpenGL for this. I looked for a way to select an object on a lot object overunder on 3D and I have found it. In this article I want to introduce you to how to do it.

Using the code

In this example I use MFC wizard. All my code was written on CView.

Add variables:

private:
    GLdouble gldAspect;
    GLsizei glnWidth, glnHeight;
    HGLRC hRC;
    Cube cube[4];
    double r;

Cube is defined in MyOpenGL.h.

Use "class wizard" for message map: WM_CREATE, WM_DESTROY, WM_EARSEBKGND, WM_LBUTTONDOWN, WM_PAINT, WM_SIZE, WM_TIMER.

On another article in CodeProject about OpenGL you can see the code for WM_SIZE and WM_PAINT, WM_CREATE (I use the code again! Thanks to the owner's code!).

Additionally, on WM_CREATE, init for some variables and start the timer for animation.

int CTry_OpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
     if (CView::OnCreate(lpCreateStruct) == -1)
          return -1;
     
     // TODO: Add your specialized creation code here
     hRC=SetUpOpenGL(m_hWnd);
     for(int i=0;i<4;i++) cube[i].x=i*2-3;
     r=0;
     SetTimer(1000,100,NULL);

     return 0;
}

Of course, kill timer in OnDestroy().

Timer:

void CTry_OpenGLView::OnTimer(UINT nIDEvent) 
{
     r+=5;
     if(r>=360) r=0;
     RedrawWindow();

     CView::OnTimer(nIDEvent);
}

In OnEraseBkgnd: delete all (if not, the screen will "flick").

And now, the code to pick an object:

void CTry_OpenGLView::OnLButtonDown(UINT nFlags, CPoint point) 
{
     // TODO: Add your message handler code here and/or call default
    GLuint selectBuf[BUFSIZE];
    GLint hits;
    GLint viewport[4];

     HDC hDC = ::GetDC(this->m_hWnd);
     wglMakeCurrent(hDC,hRC);

    glGetIntegerv (GL_VIEWPORT, viewport);
    glSelectBuffer (BUFSIZE, selectBuf);

    glRenderMode(GL_SELECT); // Enter the SELECT render mode
    glInitNames();
    glPushName(-1);

    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
    glLoadIdentity ();
    gluPickMatrix((GLdouble) point.x, 
          (GLdouble) (viewport[3] - point.y), 
          5.0, 5.0, viewport);
    gluPerspective(30.0,gldAspect,1.0,20.0);
    glMatrixMode(GL_MODELVIEW);
    PaintScreen(GL_SELECT);//function paint the objects.
    glPopMatrix ();
    glFlush ();

    hits = glRenderMode (GL_RENDER);

     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glViewport(0,0,glnWidth,glnHeight);
     gluPerspective(30.0,gldAspect,1.0,20.0);
    
     /*for(int i=0;i<hits;i++)
     {
          cube[selectBuf[3+i*4]].selected= 
             !cube[selectBuf[3+i*4]].selected;
     }//select all (include the hide object)!
     */
     if (hits)
     {
          int n=0;double minz=selectBuf[1];
          for(int i=1;i<hits;i++)
          {
               if (selectBuf[1+i*4]<minz) 
                 {n=i;minz=selectBuf[1+i*4];}
          }
          cube[selectBuf[3+n*4]].selected=
              !cube[selectBuf[3+n*4]].selected;
     }//only select the object we see (nearest object)!

     wglMakeCurrent( NULL, NULL );
    ::ReleaseDC( this->m_hWnd, hDC );

     CView::OnLButtonDown(nFlags, point);
}

Points of interest

Is it easy, isn't it? My source has some wastes, I think. Thanks a lot if you can help me to remove it! ^_^

History

  • This is the first!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

ICE_WIZARD
Software Developer (Junior)
Vietnam Vietnam
My subject is Information technology. I like programming and learn more about everything.

You may also be interested in...

Comments and Discussions

 
Questionwell done Pin
wshcdr10-Feb-14 21:47
memberwshcdr10-Feb-14 21:47 
GeneralNice One Pin
mzajewel12-Jun-12 0:00
membermzajewel12-Jun-12 0:00 
GeneralMy vote of 4 Pin
chizhaojuan28-Jul-10 16:41
memberchizhaojuan28-Jul-10 16:41 
GeneralGood 1 OpenGL Pin
se7en_hunter8-Apr-08 1:05
memberse7en_hunter8-Apr-08 1:05 
QuestionHow to move an object follow mouse? Pin
zrockmanx21-Nov-06 21:25
memberzrockmanx21-Nov-06 21:25 
AnswerRe: How to move an object follow mouse? Pin
ICE_WIZARD22-Nov-06 5:14
memberICE_WIZARD22-Nov-06 5:14 
QuestionRe: How to move an object follow mouse? Pin
zrockmanx26-Nov-06 2:44
memberzrockmanx26-Nov-06 2:44 
AnswerRe: How to move an object follow mouse? Pin
ICE_WIZARD28-Nov-06 5:12
memberICE_WIZARD28-Nov-06 5:12 
GeneralgluUnProject Pin
Merlinblack3-Jul-05 16:56
memberMerlinblack3-Jul-05 16:56 
QuestionAnother method to realize the function? Pin
aqing25-Jun-04 20:16
memberaqing25-Jun-04 20:16 
GeneralNEWBIE Pin
tarzanviet7-Jun-04 15:43
membertarzanviet7-Jun-04 15:43 
GeneralRe: NEWBIE Pin
zrockmanx21-Nov-06 21:14
memberzrockmanx21-Nov-06 21:14 
GeneralRe: NEWBIE Pin
ICE_WIZARD22-Nov-06 5:04
memberICE_WIZARD22-Nov-06 5:04 
GeneralRe: NEWBIE Pin
zrockmanx26-Nov-06 2:49
memberzrockmanx26-Nov-06 2:49 
QuestionHow to run 2 different(or same) OpenGL objects in one DialogBox? Pin
werter13-May-04 21:16
memberwerter13-May-04 21:16 
AnswerRe: How to run 2 different(or same) OpenGL objects in one DialogBox? Pin
ICE_WIZARD4-May-04 3:12
memberICE_WIZARD4-May-04 3:12 
QuestionHow the pros do it Pin
dog_spawn30-Oct-03 5:09
memberdog_spawn30-Oct-03 5:09 
AnswerRe: How the pros do it Pin
EpicBoy31-Oct-03 4:31
memberEpicBoy31-Oct-03 4:31 
GeneralRe: How the pros do it Pin
dog_spawn31-Oct-03 4:59
memberdog_spawn31-Oct-03 4:59 
GeneralRe: How the pros do it Pin
François Gasnier2-Nov-03 12:13
memberFrançois Gasnier2-Nov-03 12:13 
GeneralRe: How the pros do it Pin
Merlinblack3-Jul-05 16:53
memberMerlinblack3-Jul-05 16:53 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150731.1 | Last Updated 30 Oct 2003
Article Copyright 2003 by ICE_WIZARD
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid