MIP rendering make line black

In my application, I display a volume image using MIP. In addition, I want to add a red line with the MIP. However, even I set the line color to red, it still shown as black:

The code to reproduce the result is:

import vtkmodules.all as vtk

img = vtk.vtkImageData()
img.SetDimensions(256, 256, 256)
img.AllocateScalars(vtk.VTK_DOUBLE, 1)
for i in range(256):
    for j in range(256):
        for k in range(256):
            img.SetScalarComponentFromDouble(i, j, k, 0, i+j+k)

mapper = vtk.vtkSmartVolumeMapper()
mapper.SetInputData(img)
mapper.SetBlendModeToMaximumIntensity()

volume = vtk.vtkVolume()
volume.SetMapper(mapper)

line = vtk.vtkLineSource()
line.SetPoint1(0, 0, 0)
line.SetPoint2(300, 300, 300)
line.Update()
lineMapper = vtk.vtkPolyDataMapper()
lineMapper.SetInputData(line.GetOutput())
lineActor = vtk.vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(1, 0, 0)
lineActor.GetProperty().SetLineWidth(10)

render = vtk.vtkRenderer()
render.AddActor(volume)
render.AddActor(lineActor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(render)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
iren.Initialize()
iren.Start()

How can I make the line shown as red?
Any suggestion is appreciated~~~

1 Like

This is exactly what I was looking for. Thank you so much. :blush:

I am interested in doing something very similar but with vtk.js. Using your example, I was able to achieve what I think you want by using a second renderer and setting the renderWindow to have two layers. Can anyone suggest if this is the best way to do this? Is it possible to do the same thing in vtk.js?

import vtkmodules.all as vtk

img = vtk.vtkImageData()
img.SetDimensions(256, 256, 256)
img.AllocateScalars(vtk.VTK_DOUBLE, 1)
for i in range(256):
    for j in range(256):
        for k in range(256):
            img.SetScalarComponentFromDouble(i, j, k, 0, i+j+k)

mapper = vtk.vtkSmartVolumeMapper()
mapper.SetInputData(img)
mapper.SetBlendModeToMaximumIntensity()

volume = vtk.vtkVolume()
volume.SetMapper(mapper)

line = vtk.vtkLineSource()
line.SetPoint1(0, 0, 0)
line.SetPoint2(300, 300, 300)
line.Update()
lineMapper = vtk.vtkPolyDataMapper()
lineMapper.SetInputData(line.GetOutput())
lineActor = vtk.vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(1, 0, 0)
lineActor.GetProperty().SetLineWidth(10)

render = vtk.vtkRenderer()
render.SetLayer(0)
topRender = vtk.vtkRenderer()
topRender.SetLayer(1)
render.AddActor(volume)
topRender.AddActor(lineActor)
renWin = vtk.vtkRenderWindow()
renWin.SetNumberOfLayers(2)
renWin.AddRenderer(render)
renWin.AddRenderer(topRender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
iren.Initialize()
# have both renderers use same camera
render.SetActiveCamera(topRender.GetActiveCamera())
topRender.ResetCamera()
iren.Start()

Actually, I find the ‘black’ line can turn to ‘red’ by setting the opacity of MIP.

The modified code is:

import vtkmodules.all as vtk

img = vtk.vtkImageData()
img.SetDimensions(256, 256, 256)
img.AllocateScalars(vtk.VTK_DOUBLE, 1)
for i in range(256):
    for j in range(256):
        for k in range(256):
            img.SetScalarComponentFromDouble(i, j, k, 0, i+j+k)

mapper = vtk.vtkSmartVolumeMapper()
mapper.SetInputData(img)
mapper.SetBlendModeToMaximumIntensity()

volume = vtk.vtkVolume()
volume.SetMapper(mapper)
p = volume.GetProperty().GetScalarOpacity()
p.RemoveAllPoints()
p.AddPoint(0, 0.3)
p.AddPoint(256*3, 0.9)
line = vtk.vtkLineSource()
line.SetPoint1(0, 0, 0)
line.SetPoint2(300, 300, 300)
line.Update()
lineMapper = vtk.vtkPolyDataMapper()
lineMapper.SetInputData(line.GetOutput())
lineActor = vtk.vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(1, 0, 0)
lineActor.GetProperty().SetLineWidth(10)

render = vtk.vtkRenderer()
render.AddActor(volume)
render.AddActor(lineActor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(render)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
iren.Initialize()
iren.Start()

And the result is: