Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: mouse picking in opengl using `gluUnProject`

  1. #1
    Newbie Newbie
    Join Date
    Jun 2013
    Posts
    2

    mouse picking in opengl using `gluUnProject`

    I have a scene that I am rendering couple of cubes in it with openGL (program structure is not using GLUT,it is in win32 program structure but I just draw cubes with `glutSolidCube`)
    now I want to select these cubes by mouse by picking. this is what I am doing:
    first when the user clicks the mouse button on the scene I get the mouse position and trying to find its coordinates in scene coordinates (templateSkeletons is a skeleton I created out of cubes, nothing more):

    if (mouse.buttonPressed(Mouse::BUTTON_LEFT))
    {
    mouse.update();
    templateSkeletons[0].selectionMode = true;
    Vector3* points;
    points = GetOGLPos();
    templateSkeletons[0].setIntersectionPoints(points[0],points[1]);
    }else
    templateSkeletons[0].selectionMode = false;
    this is the `GerOGLPos` function that I am retrieving the coordinates in the scene (notice that I have my own camrea and its own projection matrix but I am fetching projection matrix here in this function just by calling `glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);` is this wrong and I should get my own camrea's projection matrix ? ) :

    Vector3* GetOGLPos()
    {Vector3 pointsOnLine[2];
    double mvmatrix[16];
    double projmatrix[16];
    int viewport[4];
    double dX, dY, dZ, dClickY,zz;
    glGetIntegerv(GL_VIEWPORT, viewport);
    glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
    glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
    dClickY = double (viewport[3] - mouse.yPos());
    // OpenGL renders with (0,0) on bottom, mouse reports with (0,0) on top
    //glReadPixels( mouse.xPos(), int(dClickY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zz );
    gluUnProject ((double) mouse.xPos(), dClickY, 0.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
    pointsOnLine[0] = Vector3( (float) dX, (float) dY, (float) dZ );
    gluUnProject ((double) mouse.xPos(), dClickY, 1.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
    pointsOnLine[1] = Vector3( (float) dX, (float) dY, (float) dZ );

    return pointsOnLine;
    }
    now I suppose I have two points indicating my picking ray in the scene. now when I render the cubes I try to calculate the distance of the line created by the ray and the cube, and if it is smaller than a value I change the color of the cube to know that I picked it (jointsOfSkeleton indicates each cube that is created the skeleton nothing more, in here I am testing just the cube number 6 in array ):

    if(selectionMode)
    {

    distToLine = Vector3::PointToLineDistance3D(rayPoints[0],rayPoints[1],Vector3::Vector3(jointsOfSkeleton[6].x,
    jointsOfSkeleton[6].y,jointsOfSkeleton[6].z));
    //distToLine = sqrt(distToLine);
    if(distToLine < 0.5)
    glColor3f(1.0,0.0,0.0);

    else
    glColor3f(1.0,1.0,1.0);
    }

    when I click on irrelevant positions on the window I see the colors of cube changes, it doesn't work right, I am watching the distances on the debugger and the distances doesn't look right. and this is function I used for finding Line-point distance:

    static float PointToLineDistance3D(Vector3 a, Vector3 b, Vector3 point)
    {

    Vector3 lineDirection = b - a;
    float t = (Vector3::dot(point,lineDirection) - Vector3::dot(lineDirection,a))/(Vector3::dot(lineDirection,lineDirection));
    Vector3 direction;
    direction.x = a.x + (lineDirection.x *t) - point.x;
    direction.y = a.y + (lineDirection.y *t) - point.y;
    direction.z = a.z + (lineDirection.z *t) - point.z;

    float ShortestDistance = sqrtf((direction.x*direction.x)+(direction.y*direc tion.y)+(direction.z*direction.z));

    return ShortestDistance;

    }

    sorry for long post but I will appreciate your patience to read and helps and insights. where I did wrong.

  2. #2
    Newbie Newbie
    Join Date
    Jun 2013
    Posts
    2
    I changed the PointToLineDistance3D function, now it works well. but the problem now is that I have my own camera, so I load its projection and modelview matrices when I am doing glUnProject.
    as you see in the snapshot I have selection when I am not on joints the joint gets selected. it is like that my ray come from another point and it does not match with the cursor
    any ideas ?

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •