[vtkusers] iren->Set*PickMethod() obsoleted?

Denis Shamonin dshamoni at science.uva.nl
Wed Apr 23 10:34:43 EDT 2003


Bruce.Lamond at ed.ac.uk wrote:

> Hi there,
> I'm trying to use VTK to return (x,y,z) coordinate corresponding to 
> the cursor
> position when 'p' is pressed. I thought this might involve using the
> iren->Set*PickMethod() but see that this is not to be used in future. 
> Does
> anyone know how I should go about getting the coordinate corresponding 
> to a pick
> event?
> cheers
> Bruce Lamond
>  
>
Depend. If you will make pick operation you will get not a point (xyz) 
but vector.
This vector will start from XY on the X window which should be converted 
to world coordinats like
//---
float* YouClass::ComputeWorldCoordinate(float x,float y,float z)
{
 float *WorldCoordinate;
 vtkCoordinate *Coordinate = vtkCoordinate::New();
  Coordinate->SetCoordinateSystem(VTK_DISPLAY);
  Coordinate->SetValue(x,y,z);
  WorldCoordinate = Coordinate->GetComputedWorldValue(ren);

 return WorldCoordinate;
}

if you know XY on you X window use it like
//---
float *t;
t = this->ComputeWorldCoordinate((float)X1,(float)Y1,0.0);

Then end will be clipping rage of the camera->GetClippingRange(), or *inf*.
You can use this for calculate end point:
//---
void YouClass::EndPoint(float Point[3], float EndPoint[3])
{
 float cameraPos[4], cameraFP[4];
 float cameraDOP[3];
 float ray[3], rayLength;
 double *clipRange;
 float tF, tB;
 float p2World[4];
 int i;

 vtkCamera *camera = this->ren->GetActiveCamera();
 camera->GetPosition((float *)cameraPos); cameraPos[3] = 1.0;
 camera->GetFocalPoint((float *)cameraFP); cameraFP[3] = 1.0; 
 for (i=0; i<3; i++)
 {
  ray[i] = Point[i] - cameraPos[i];
 }

 for (i=0; i<3; i++)
 {
  cameraDOP[i] = cameraFP[i] - cameraPos[i];
 }
 
 vtkMath::Normalize(cameraDOP);

 if (( rayLength = vtkMath::Dot(cameraDOP,ray)) == 0.0 )
   {
    vtkErrorMacro(<< "Cannot process points");
   }

 clipRange = camera->GetClippingRange();

 if ( camera->GetParallelProjection() )
   {
   tF = clipRange[0] - rayLength;
   tB = clipRange[1] - rayLength;
   for (i=0; i<3; i++)
     {
      p2World[i] = Point[i] + tB*cameraDOP[i];
     }
   }
 else
   {
   tF = clipRange[0] / rayLength;
   tB = clipRange[1] / rayLength;
   for (i=0; i<3; i++)
     {
      p2World[i] = cameraPos[i] + tB*ray[i];
     }
   }

 p2World[3] = 1.0;

 for (i=0; i<3; i++)
 {
  EndPoint[i] = p2World[i];
 }
}

Then you can calculate vector. If you know how

-- 
Denis Shamonin
Address       : Section Computational Science
               University of Amsterdam
               Kruislaan 403, 1098 SJ Amsterdam
               the Netherlands

E-mail        : dshamoni at science.uva.nl
URL           : http://www.science.uva.nl/~dshamoni/





More information about the vtkusers mailing list