[vtkusers] picking vtkImageSlice using vtkCellPicker?
Miro Drahos
mdrahos at robodoc.com
Tue Mar 25 15:24:58 EDT 2014
Hi David,
I investigated this issue further and indeed vtkCellPicker works fine
with vtkImageActor/vtkImageSlice when I plug in different images.
It so happens that my image has negative spacing (in z-direction), and
that seems to cause issues. If I load the same image and flip the
z-spacing sign, picking works fine. I had a look at the vtkImageActor
class and saw the if-clauses taking care of the spacing sign (when
setting display bounds), but I have not seen a similar treatment in
vtkImageSliceMapper -- is it possible that the issue is there?
I have had issues with images with negative spacing before, in
particular marching cubes filter as well as volumeMapper don't support
the negative spacing (in vtk 5.10). I was able to work around this by
flipping the spacing (and changing the origin) but I would rather keep
the negative spacing as is, since that's how the slices were acquired,
in the -z direction.
Do you (or anyone else?) know where in the vtk codebase could this
problem (picking dependent on the spacing sign of the image) be?
I believe that picking takes into consideration just the actor bounds,
but the rendering works just fine, so I am quite puzzled.
I am hoping that once I know where the problem is, I can derive a class
implementing the correct behavior and use that instead.
Any advice is greatly appreciated, as always.
Best,
Miro
On 03/20/2014 02:29 PM, David Gobbi wrote:
> Hi Miro,
>
> I checked through the git logs, the only recent fix to vtkCellPicker
> had to do with the fact that GetMapper() returned null for
> vtkImageSlice (but it still returned the prop and position just fine).
> However, I noticed that the only nightly test for picking images uses
> a vtkImageActor (a subclass of vtkImageSlice) instead of using
> vtkImageSlice directly. This shouldn't make a difference, but it
> might be worth investigating.
>
> David
>
> On Thu, Mar 20, 2014 at 2:17 PM, Miro Drahos <mdrahos at robodoc.com> wrote:
>> Hi David,
>> thank you for your prompt response.
>>
>> I am using VTK 5.10 and doing nothing special as far as I can tell. Here is
>> some more details:
>>
>> I have a vector of vtkSmartPointer<vtkImageSlice> objects to display images
>> [my 3D CT image has several segments with different slice thicknesses, so
>> that's why I have a vector of them]. All the reslicing and visualization is
>> working as expected, so I don't suspect an issue there.
>> Now I am observing LeftMouseEvent of the interactor and processing it in my
>> callback class to recognize when the surface model is picked. If it is, then
>> user can translate and rotate it. The callback class is derived from both
>> vtkCommand and QObject (to be able to use signal/slots of Qt that this is
>> part of) and I am implementing FindPickedActor(int x, int y) method as I
>> have seen it throughout VTK many times.
>> I have tried to use different pickers, and decided for vtkCellPicker instead
>> of vtkPropPicker, to be able to set tolerance (user can make the surface
>> model transparent and then might want to pick just the outline --
>> intersection of the surface and the image reslice plane. Picking outline is
>> hard with no tolerance).
>> Picking surface model works just fine.
>>
>> Here is the Print() of one of my vtkImageSlice instance:
>>
>> vtkImageSlice (0x4ecbd30)
>> Debug: Off
>> Modified Time: 64690
>> Reference Count: 3
>> Registered Events: (none)
>> Dragable: On
>> Pickable: On
>> AllocatedRenderTime: 860.822
>> EstimatedRenderTime: 0
>> NumberOfConsumers: 1
>> RenderTimeMultiplier: 0.863803
>> Visibility: On
>> PropertyKeys: none.
>> useBounds: 1
>> IsIdentity: true
>> Position: (0, 0, 0)
>> Orientation: (0, 0, 0)
>> Origin: (0, 0, 0)
>> Scale: (1, 1, 1)
>> Bounds:
>> Xmin,Xmax: (-100, 100)
>> Ymin,Ymax: (-100, 100)
>> Zmin,Zmax: (-90.625, -2.5)
>> UserTransform: (none)
>> UserMatrix: (none)
>> Property:
>> Debug: Off
>> Modified Time: 64690
>> Reference Count: 3
>> Registered Events: (none)
>> ColorWindow: 260.1
>> ColorLevel: 119.85
>> UseLookupTableScalarRange: Off
>> LookupTable: 0x156088a0
>> Opacity: 1
>> Ambient: 0.3
>> Diffuse: 1
>> InterpolationType: Linear
>> LayerNumber: 0
>> Checkerboard: Off
>> CheckerboardSpacing: 10 10
>> CheckerboardOffset: 0 0
>> Backing: Off
>> BackingColor: 0 0 0
>> Mapper:
>> Debug: Off
>> Modified Time: 96181
>> Reference Count: 3
>> Registered Events: (none)
>> Executive: 0x4ecc950
>> ErrorCode: Success
>> Information: 0x4ecc440
>> AbortExecute: Off
>> Progress: 1
>> Progress Text: (None)
>> TimeToDraw: 0
>> ClippingPlanes: (none)
>> SlicePlane: 0x4691280
>> SliceAtFocalPoint: Off
>> SliceFacesCamera: Off
>> Border: On
>> Background: Off
>> NumberOfThreads: 8
>> JumpToNearestSlice: Off
>> AutoAdjustImageQuality: On
>> SeparateWindowLevelOperation: On
>> ResampleToScreenPixels: On
>> SlabThickness: 0
>> SlabType: Mean
>> SlabSampleFactor: 2
>> ImageSampleFactor: 1
>> Interpolator: 0x4ecf330
>> Bounds: (-100, 100) (-100) (100) (-90.625) (-2.5)
>>
>> I will make a simple mock program and try to isolate the problem.
>> Thank you once again!
>> Miro
>>
>>
>>
>>
>> On 03/20/2014 12:31 PM, David Gobbi wrote:
>>> Hi Miro,
>>>
>>> You'll have to provide more details, because I use vtkCellPicker on
>>> vtkImageSlice all the time. It's even part of the nightly VTK testing.
>>> Is there anything special about the way you use the vtkImageSlice?
>>> What version of VTK are you using?
>>>
>>> David
>>>
>>> On Thu, Mar 20, 2014 at 1:15 PM, Miro Drahos <mdrahos at robodoc.com> wrote:
>>>> Hi all,
>>>> I am rendering an image slice using vtkImageSlice and a surface
>>>> (vtkActor).
>>>> When I perform picking using vtkCellPicker, I always pick the surface
>>>> actor,
>>>> even if it is in the background, behind the vtkImageSlice.
>>>> If I try to pick the vtkImageSlice (and the ray does not intersect the
>>>> surface actor), the Pick() method returns 0, as well as picker->GetPath()
>>>> returns NULL. The vtkImageSlice is set to be pickable.
>>>> I am quite baffled by this, since I'd expect to be able to pick
>>>> vtkImageSlice with vtkCellPicker, since it is a vtkProp3D.
>>>> If I use vtkPropPicker, I can pick the image slice fine, but I would
>>>> prefer
>>>> to use vtkCellPicker so that I can specify picking tolerance.
>>>> Can someone shed some light on this?
>>>> Thank you tons!
>>>> Miro
>>
More information about the vtkusers
mailing list