[vtkusers] picking woes
Mike Dresser
Michael-Dresser at mail.omrf.ouhsc.edu
Fri Feb 15 10:46:34 EST 2002
Hello all.
I'm using texture maps on plane sources to visualize 3D datasets, in
MFC/VC++6, and having a problem with picking points.
In the vtkMFCRenderView-derived View class, I use PreTranslateMessage to
intercept messages, here WM_LBUTTONUP (before sending it on to
vtkMFCRenderView), to launch a hardware pick using the code summarized
below, essentially as suggested by Robert Mitchell in Sept 2001. The
problem I'm having is that it works well with a relatively small dataset (40
X 41 X 20) but with a larger dataset (512 X 512 X 40) the world coordinates
returned are consistently smaller than they should be, e. g., 73,73,12 when
they should be 255,255,43. The problem first shows up in
vtkRenderer::ViewToWorld() when the viewpoint (which seems OK) is multiplied
by the perspective transform from the camera. I have the same problem
whether I use WinNT, with a 3dLabs Oxygen GVX210, and using VTK4 from CVS
(Sept 2001) or Win98, with an ATI Rage ... card, using VTK4 from last week.
Also, I get the same results if I use software picking via vtkPointPicker.
code excerpt
---------------------------------------------------------------------------
BOOL COMRFMAJNView::PreTranslateMessage(MSG* pMsg)
{
if (m_bShowVoxelInfo) {
if (pMsg->message == WM_LBUTTONUP) {
vtkAssemblyPath *path = NULL;
vtkAbstractPropPicker *picker = NULL;
//call InteractorStyle's picker, as if 'p' was hit
this->Trackball->OnChar(0,0,'p',0);
// if one of the image planes or the extracted surface is hit
if (
(picker=vtkAbstractPropPicker::SafeDownCast(this->Interactor->GetPicker())))
{
path = picker->GetPath();
}
//if a surface/actor has been hit, get the voxel intensity that is
associated
if ( path != NULL ) {
vtkWorldPointPicker* pPicker = (vtkWorldPointPicker*)
this->Interactor->GetPicker();
//.............................
float *pos;
pos = pPicker->GetPickPosition();
// get values from "pos", correct for problems at edges (negative
values,
// values outside extents) and report them
}
}//end if (pMsg . . .
}//end if (m_bShowVoxelInfo)
return vtkMFCRenderView::PreTranslateMessage(pMsg);
}
----------------------------------------------------------------------------
----------
Any helpful suggestions will be greatly appreciated.
Mike Dresser
dresserm at omrf.ouhsc.edu
More information about the vtkusers
mailing list