[vtkusers] Volume rendering example
Lodron, Gerald
Gerald.Lodron at joanneum.at
Wed Oct 28 07:00:32 EDT 2009
Hi
OK, now i do it like in SimpleRayCast but I have the following problem: The vtkVolumeRayCastMapper does not take my data (only unsigned char allowed, i have signed things). So I must first rescale my data between 0 and 1 into a unsigned char format using a lookup table:
vtkLookupTable *table = vtkLookupTable::New();
table->SetSaturationRange(0,0);
table->SetRange(-1500, 2500); //All necessary information is between -1500 and 2500
table->SetValueRange(0,1); //And is scaled between 0 and 1
table->SetRampToLinear();
table->Build();
vtkImageMapToColors *color = vtkImageMapToColors::New();
color->SetLookupTable(table);
color->SetInputConnection(data->GetProducerPort());
So, now I want to display bones in white, bones have usually a value between 500 and 1500, because of the scaling between 0 and 1 I must calculate the new mapped data:
double bone_begin = ((500-(-1500))/(2500-(-1500)));
double bone_end = ((1500-(-1500))/(2500-(-1500)));
Now I can make the volume rendering stuff:
vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(0,0.0);
opacityTransferFunction->AddPoint(bone_begin,0);
opacityTransferFunction->AddPoint(bone_begin+0.01,0.2);
opacityTransferFunction->AddPoint(bone_end,0.2);
opacityTransferFunction->AddPoint(bone_end+0.01/255,0);
opacityTransferFunction->AddPoint(1,0);
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New(); //bones are white
colorTransferFunction->AddRGBPoint(0,1.0,1.0,1.0);
colorTransferFunction->AddRGBPoint(1,1.0,1.0,1.0);
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->SetInterpolationTypeToLinear();
vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
volumeMapper->SetInputConnection(color->GetOutputPort());
vtkVolume *volume=vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
m_Renderer->AddVolume(volume);
m_Renderer->Render();
All I get is a cube with white noisy points. What is wrong with my settings?
Thanks and best regards
Gerald
________________________________
Von: Martin Schmitz [mailto:meindatenlaufwerk at googlemail.com]
Gesendet: Mittwoch, 28. Oktober 2009 10:50
An: Lodron, Gerald
Betreff: Re: [vtkusers] Volume rendering example
hallo Gerald,
look in in the vtk Source directory under "\Examples\VolumeRendering\Python" you find a file "SimpleRayCast" it shows a simple volume rendering example. You find an another color transfer function. May this help you.
2009/10/28 Lodron, Gerald <Gerald.Lodron at joanneum.at>
Hi,
I want to render a volume using VTK but i have some problems, may anyone can help me a little bit:
I have a 3d volume of a human CT scan, the range is in hountsfield units so we have signed char. I want to render it like in "The Visualization Toolkit - Will Schroeder, Ken Martin, Bill Lorensen" book on page 233 but the author does not provide any code of his results (also not on the CD).
//First get the range of my image
double *range = data->GetScalarRange();
//Scale the image between 0 and 1 using a lookup table
vtkLookupTable *table = vtkLookupTable::New();
table->SetValueRange(0,1);
table->SetSaturationRange(0,0);
table->SetRange(range[0], range[1]); //shoul here not be the minimum/maximum possible of "data"?
table->SetRampToLinear();
table->Build();
// Map the image through the lookup table
vtkImageMapToColors *color = vtkImageMapToColors::New();
color->SetLookupTable(table);
color->SetInputConnection(data->GetProducerPort());
//The opacity function should map the data from invisible to visible
vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(0,0.0);
opacityTransferFunction->AddPoint(1,0.2); //should it be (1,0.2) or (255, 0.2)? Shouldnt it be like table->SetValueRange(0,1)?
//Color the image from black to white, does anybody has some good color functions for me??
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(0,0.0,0.0,0.0);
colorTransferFunction->AddRGBPoint(1,1.0,1.0,1.0);
//Generate a volume Property
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->SetInterpolationTypeToLinear();
//I do not exactly know what this stuff does but it renders:
vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
volumeMapper->SetInputConnection(color->GetOutputPort());
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
vtkLODProp3D *prop = vtkLODProp3D::New();
prop->AddLOD(volumeMapper,volumeProperty, 0.0);
m_Renderer->AddViewProp(prop);
m_Renderer->Render();
Does this code seems right? I only see a strange cube
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.vtk.org/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list