interactor stops after scaling volume

hi,

i was experimenting with medical demo volume rendering example with my own nii file,

i want to use the convention 1 unit = 1 meter so i scaled the volume by using vtk transform scale property and after the volume is scaled the vtk trackball camera interactor is not working anymore, when i try to move the volume the window just stops responding and crashes and also the box widget re scales but the sphere on the outside used for clipping interaction are still very big. can some one please help?

Thanks

my code for re scaling the volume is below

reader = vtk.vtkNIFTIImageReader()
reader.SetFileName(PathDicom)
reader.Update()

volumeMapper = vtk.vtkSmartVolumeMapper()
volumeMapper.SetInputConnection(reader.GetOutputPort())
volumeMapper.SetSampleDistance(-0.001)

window_width = 90
window_level = 150

volumeColor = vtk.vtkColorTransferFunction()
volumeColor.AddRGBSegment(window_level - 0.5 * window_width, 0.0, 0.0, 0.0,
                          window_level + 0.5 * window_width, 1.0, 1.0, 1.0)

volumeScalarOpacity = vtk.vtkPiecewiseFunction()
volumeScalarOpacity.AddSegment(window_level - 0.5 * window_width, 0.0,
                               window_level + 0.5 * window_width, 1.0)

volumeGradientOpacity = vtk.vtkPiecewiseFunction()
volumeGradientOpacity.AddPoint(0, 0.0)
# volumeGradientOpacity.AddPoint(90, opacity_control / 2)
volumeGradientOpacity.AddPoint(100, opacity_control)

volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(volumeColor)
volumeProperty.SetScalarOpacity(volumeScalarOpacity)
volumeProperty.SetGradientOpacity(volumeGradientOpacity)
volumeProperty.SetInterpolationTypeToLinear()
volumeProperty.ShadeOn()
volumeProperty.SetAmbient(0.4)
volumeProperty.SetDiffuse(0.6)
volumeProperty.SetSpecular(0.2)
volumeProperty.SetScalarOpacityUnitDistance(1)

volume = vtk.vtkVolume()
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)

pick_volume_points()
scene_renderer.AddViewProp(volume)
render_window.Render()

render_window_interactor = vtk.vtkRenderWindowInteractor()
interaction_style = vtk.vtkInteractorStyleImage()
render_window_interactor.SetInteractorStyle(interaction_style)
render_window_interactor.SetRenderWindow(render_window)

render_window_interactor.AddObserver('MouseWheelForwardEvent', onMouseWheelForwardEvent)
render_window_interactor.AddObserver('MouseWheelBackwardEvent', onMouseWheelBackwardEvent)

planes = vtk.vtkPlanes()


def ClipVolumeRender(obj, event):
    print("inside here")

    obj.GetPlanes(planes)
    volumeMapper.SetClippingPlanes(planes)


boxWidget = vtk.vtkBoxWidget()
boxWidget.SetInteractor(render_window_interactor)
boxWidget.SetPlaceFactor(1.0)

boxWidget.SetInputData(reader.GetOutput())
boxWidget.PlaceWidget(reader.GetOutput().GetBounds())
boxWidget.InsideOutOn()
boxWidget.AddObserver("InteractionEvent", ClipVolumeRender)
boxWidget.AddObserver("MiddleButtonPressEvent", ClipVolumeRender)
boxWidget.AddObserver("MiddleButtonReleaseEvent", ClipVolumeRender)

boxWidget.EnabledOn()
boxWidget.TranslationEnabledOn()
render_window.Render()

transform = vtkTransform()
transform.SetMatrix(sometransform.GetMatrix())
transform.Scale(0.001, 0.001, 0.001)
transform.Update()

volume.SetUserMatrix(transform.GetMatrix())
boxWidget.SetTransform(transform)

You may try keeping the user transform identity and instead update image spacing in the reader’s output vtkImageData, or modify scaling of the actor.

hi,

Thanks for the suggestion, changing the reader’s spacing solved the issue

Thanks

1 Like