[vtkusers] Doubt with point picker

Imanol Muñoz Pandiella imanolm at lsi.upc.edu
Thu Jul 19 02:49:37 EDT 2012


Hello,

I'm trying to display a sphere lying on a triangle mesh. The user can 
move this sphere over the triangle mesh with the mouse.

The user put the sphere over the mesh with a click. To get the point of 
the mesh clicked I use the following code:

    mPointPicker = vtkCellPicker::New();
    mPointPicker->Pick(mStyle->GetInteractor()->GetEventPosition()[0],
    mStyle->GetInteractor()->GetEventPosition()[1], 0,
    mStyle->GetInteractor()->GetRenderWindow()->GetRenderers()->GetFirstRenderer());

    double p[3];
    p[0] = p[1] = p[2] = 0.;
    if (id_actor == (int)(mModel->getBoneActor()))
    mModel->getSkeletonMesh()->GetPoint(id, p);
    else if (id_actor == (int)(mModel->getLungsActor()))
    mModel->getLungsMesh()->GetPoint(id, p);
    else return;

    vtkSphereSource* sphereSource =  vtkSphereSource::New();
    sphereSource->SetCenter(p[0], p[1], p[2]);


With this code, the position of the sphere is ever well computed (It 
have never failed me...)

The user can move the sphere over the mesh with a click and a movement 
of the mouse. To compute the temporal position (while the user is moving 
the sphere) I use the following code:

    double *pointPicker;
    mWorldPointPicker->Pick(mStyle->GetInteractor()->GetEventPosition()[0],
    mStyle->GetInteractor()->GetEventPosition()[1],
    0,mQVTKWidget->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
    pointPicker = mWorldPointPicker->GetPickPosition();
    sphere->SetCenter(pointPicker[0],pointPicker[1],pointPicker[2]);


I use that code, because with it I get better performance than with the 
other picker. But, as I get worse precision, when the user release the 
mouse button I use the following code to obtain the exact final position:

    mPointPicker->Pick(mStyle->GetInteractor()->GetEventPosition()[0],
    mStyle->GetInteractor()->GetEventPosition()[1], 0,
    mStyle->GetInteractor()->GetRenderWindow()->GetRenderers()->GetFirstRenderer());

    double p[3];
    p[0] = p[1] = p[2] = 0.;
    if (id_actor == (int)(mModel->getBoneActor()))
    mModel->getSkeletonMesh()->GetPoint(idPicker, p);
    else if (id_actor == (int)(mModel->getLungsActor()))
    mModel->getLungsMesh()->GetPoint(idPicker, p);
    else return;

    sphere->SetCenter(p[0],p[1],p[2]);



The problem is that although I use the same code than when the sphere is 
added, the position obtained is not correct. Sometimes after I move the 
sphere it is not well positioned. It is not on the surface, it have an 
empty space between the sphere and the surface...

What am I doing wrong?
There is any other call with more precision??
Other actors in the renderer without visibility affect to this call?

Thank you very much for helping me,

-- 
Imanol Muñoz i Pandiella.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120719/aaf19295/attachment.htm>


More information about the vtkusers mailing list