I think the method that the OP is looking for is the following, which can also be used from Python:
vtkImageData::TransformPhysicalPointToContinuousIndex(const double xyz[3], double ijk[3])
There are three coordinate systems in play:
- the VTK world coordinates, which are returned by
picker.GetPickPosition()
- the VTK data coordinates, which are returned by
picker.GetMapperPosition()
- the image data structured point coordinates, i.e. the voxel indices
Not all pickers have a GetMapperPosition()
method. Which picker are you using?
If you can use GetMapperPosition()
, then you can compute the voxel index like this:
xyz = picker.GetMapperPosition()
XYZ = [0.0, 0.0, 0.0] # to store voxel index
image.TransformPhysicalPointToContinuousIndex(xyz, XYZ)
print(XYZ)
If you cannot use GetMapperPosition()
, you must use the inverse of the actor’s matrix to convert the result of GetPickPosition()
from the world coordinate system to the actor’s local data coordinate system.
The picker will automatically take all camera parameters into account, so you never have to worry about the camera when you use picker.GetPickPosition()
or picker.GetMapperPosition()
.