Sign in to follow this  
OgbobeBuko

Picking 3D models

Recommended Posts

OgbobeBuko    100
Guys i really need your help, any ideas on how i could get picking working in my program...i have 6 models rendered. i tried to implement picking but what happens is that, it only gets a hit when certain parts in the scene are clicked (but does not record a hit when the models are clicked). please what could be the problem.


thank you.

Share this post


Link to post
Share on other sites
OgbobeBuko    100
[quote name='GottiJay' timestamp='1309813789' post='4831146']
Guys i really need your help, any ideas on how i could get picking working in my program...i have 6 models rendered. i tried to implement picking but what happens is that, it only gets a hit when certain parts in the scene are clicked (but does not record a hit when the models are clicked). please what could be the problem.


thank you.
[/quote]
Please can someone help???i have read every article on picking and still cant get my program to pick properly....just a look at what i may be doing wrong will be fine thank you
[code]

void selection(int x, int y)
{
GLuint buff[64] = {0};
GLint hits, view[4];



glSelectBuffer(64, buff); //This chooses the buffer where store the values for the selection data

glGetIntegerv(GL_VIEWPORT, view); //This retrieve info about the viewport

glRenderMode(GL_SELECT); // Switching in selecton mode

glInitNames();// Clearing the name's stack

glPushName(0); //filling the stack with one element


glMatrixMode(GL_PROJECTION); // Now modify the vieving volume, restricting selection area around the cursor
glPushMatrix();
glLoadIdentity();


gluPickMatrix((GLdouble)x,(GLdouble) (view[3] - y),1.0,1.0, view); //restrict the draw to an area around the cursor
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);

glMatrixMode(GL_MODELVIEW); // Draw the objects onto the screen

glutSwapBuffers(); //draw only the names in the stack, and fill the array

drawReflector(GL_SELECT);
//drawMast(GL_SELECT);
drawReflector(GL_SELECT);

glMatrixMode(GL_PROJECTION);
glPopMatrix();

/*
this will help us get the number of objects drawed in that area
and return to render mode
*/
hits = glRenderMode(GL_RENDER);

list_hits(hits, buff); // Print a list of the objects


//selectAll(hits, buff);

glMatrixMode(GL_MODELVIEW);
}

[/code]

Share this post


Link to post
Share on other sites
anttoo    218
[quote name='GottiJay' timestamp='1309850396' post='4831238']
[quote name='GottiJay' timestamp='1309813789' post='4831146']
Guys i really need your help, any ideas on how i could get picking working in my program...i have 6 models rendered. i tried to implement picking but what happens is that, it only gets a hit when certain parts in the scene are clicked (but does not record a hit when the models are clicked). please what could be the problem.


thank you.
[/quote]
Please can someone help???i have read every article on picking and still cant get my program to pick properly....just a look at what i may be doing wrong will be fine thank you
[code]

void selection(int x, int y)
{
GLuint buff[64] = {0};
GLint hits, view[4];



glSelectBuffer(64, buff); //This chooses the buffer where store the values for the selection data

glGetIntegerv(GL_VIEWPORT, view); //This retrieve info about the viewport

glRenderMode(GL_SELECT); // Switching in selecton mode

glInitNames();// Clearing the name's stack

glPushName(0); //filling the stack with one element


glMatrixMode(GL_PROJECTION); // Now modify the vieving volume, restricting selection area around the cursor
glPushMatrix();
glLoadIdentity();


gluPickMatrix((GLdouble)x,(GLdouble) (view[3] - y),1.0,1.0, view); //restrict the draw to an area around the cursor
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);

glMatrixMode(GL_MODELVIEW); // Draw the objects onto the screen

glutSwapBuffers(); //draw only the names in the stack, and fill the array

drawReflector(GL_SELECT);
//drawMast(GL_SELECT);
drawReflector(GL_SELECT);

glMatrixMode(GL_PROJECTION);
glPopMatrix();

/*
this will help us get the number of objects drawed in that area
and return to render mode
*/
hits = glRenderMode(GL_RENDER);

list_hits(hits, buff); // Print a list of the objects


//selectAll(hits, buff);

glMatrixMode(GL_MODELVIEW);
}

[/code]
[/quote]

Try and reduce your far plane, from what I understand the picking will only differentiate between things more than (10000.0f /65,000) = about 0.2?. Perhaps that will help.


Here is my picking code if that helps
[CODE] const int pickBufferSize = 1000;

unsigned int pickBuffer[pickBufferSize];

for ( int i = 0; i < pickBufferSize; ++i)
pickBuffer[i] = 0;

int viewport[4];

//setup selection buffer
glSelectBuffer(pickBufferSize, pickBuffer);

glRenderMode(GL_SELECT);

//This is currently test code:
glInitNames();
glPushName(6666666); //evil!

//Set the picking matrix
glGetIntegerv(GL_VIEWPORT,viewport);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(GameCore::App()->MouseX(),viewport[3]-GameCore::App()->MouseY(),
1,1,viewport);

//Normal render
this->Render();

int nHits = glRenderMode(GL_RENDER);

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glLoadIdentity();
[/CODE]

Share this post


Link to post
Share on other sites
OgbobeBuko    100
[quote name='anttoo' timestamp='1310334475' post='4833475']
[quote name='GottiJay' timestamp='1309850396' post='4831238']
[quote name='GottiJay' timestamp='1309813789' post='4831146']
Guys i really need your help, any ideas on how i could get picking working in my program...i have 6 models rendered. i tried to implement picking but what happens is that, it only gets a hit when certain parts in the scene are clicked (but does not record a hit when the models are clicked). please what could be the problem.


thank you.
[/quote]
Please can someone help???i have read every article on picking and still cant get my program to pick properly....just a look at what i may be doing wrong will be fine thank you
[code]

void selection(int x, int y)
{
GLuint buff[64] = {0};
GLint hits, view[4];



glSelectBuffer(64, buff); //This chooses the buffer where store the values for the selection data

glGetIntegerv(GL_VIEWPORT, view); //This retrieve info about the viewport

glRenderMode(GL_SELECT); // Switching in selecton mode

glInitNames();// Clearing the name's stack

glPushName(0); //filling the stack with one element


glMatrixMode(GL_PROJECTION); // Now modify the vieving volume, restricting selection area around the cursor
glPushMatrix();
glLoadIdentity();


gluPickMatrix((GLdouble)x,(GLdouble) (view[3] - y),1.0,1.0, view); //restrict the draw to an area around the cursor
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);

glMatrixMode(GL_MODELVIEW); // Draw the objects onto the screen

glutSwapBuffers(); //draw only the names in the stack, and fill the array

drawReflector(GL_SELECT);
//drawMast(GL_SELECT);
drawReflector(GL_SELECT);

glMatrixMode(GL_PROJECTION);
glPopMatrix();

/*
this will help us get the number of objects drawed in that area
and return to render mode
*/
hits = glRenderMode(GL_RENDER);

list_hits(hits, buff); // Print a list of the objects


//selectAll(hits, buff);

glMatrixMode(GL_MODELVIEW);
}

[/code]
[/quote]

Try and reduce your far plane, from what I understand the picking will only differentiate between things more than (10000.0f /65,000) = about 0.2?. Perhaps that will help.


Here is my picking code if that helps
[CODE] const int pickBufferSize = 1000;

unsigned int pickBuffer[pickBufferSize];

for ( int i = 0; i < pickBufferSize; ++i)
pickBuffer[i] = 0;

int viewport[4];

//setup selection buffer
glSelectBuffer(pickBufferSize, pickBuffer);

glRenderMode(GL_SELECT);

//This is currently test code:
glInitNames();
glPushName(6666666); //evil!

//Set the picking matrix
glGetIntegerv(GL_VIEWPORT,viewport);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(GameCore::App()->MouseX(),viewport[3]-GameCore::App()->MouseY(),
1,1,viewport);

//Normal render
this->Render();

int nHits = glRenderMode(GL_RENDER);

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glLoadIdentity();
[/CODE]


[/quote]
thanks antoo for trying to help...i managed to get it working some days back....i appreciate
not to be greedy or anything i do need your help in some other context,i have been trying drag the models i pick in x,y and z axis, could you please explain to me how you did do this in your program...or you could give an idea how i could do this.....

thank you


Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this