I am currently using vtkColorTransferFunction together with a preset colormap to color points, which very convenient when processing all points as a whole.
However, I’m trying to implement a “focus” feature, which consists of highlighting a selected point by make all the others transparent. Therefore, changing their alpha value.
From what I could find in this forum and Github, ColorTransferFunction does not support RGBA, but only RGB.
Is there any way I could change the Alpha value for a single point while still using ColorTransferFunction?
If not, is there any workaround for it?
IDK if there’s a way to do it with ColorTransferFunction, I think not.
But the main way to vary opacity, I think, is to create a PiecewiseFunction and use the poorly named
setPiecewiseFunction on the Property. Not seeing where this is documented, but it seems to work.
So something like this:
const ofun = vtkPiecewiseFunction.newInstance();
It also looks like
setPiecewiseFunction is not available for all actors. This can be used with
volumeViewer, but not with a simple actor (which I’m using).
PiecewiseFunction does not provide individual point control, but applies it on all the set of points.
If it’s a polydata, you use a
vtkLookupTable.newInstance() (that takes RGBA) as
Is it possible to use
vtkColorMaps just like you would use it for
vtkColorTransferFunction by using
applyColorMap? I could not find that either.
I guess it is missing indeed.
You can add
vtkLookupTable.applyColorMap() yourself (contributions are welcome ) looking at how it has been done in
vtkColorTransferFunction.applyColorMap. I guess it will only apply to “IndexedColors” color maps.
I have a method where I map from a Qt QGradient instance to a vtkLookupTable by way of a vtkColorTransferFunction. The QGradient has a set of color stops which in a Qt application results in color interpolation between stops. To do the same in vtk, I do this to create the lut:
vtkSmartPointer<vtkLookupTable> CQVTKGradientBuilder::createFromGradient( const QGradient & gradient, int nLevels /*= 256 */ )
const QGradientStops & stops = gradient.stops();
for ( auto & stop : stops )
auto position = stop.first;
auto color = stop.second;
ctf->AddRGBPoint( position, color.redF(), color.greenF(), color.blueF() );
lut->SetNumberOfTableValues( nLevels );
double rgb[ 3 ];
auto nColors = lut->GetNumberOfColors();
for ( auto nColor = 0; nColor < nColors; ++nColor )
ctf->GetColor( static_cast<double>( nColor ) / nColors, rgb );
lut->SetTableValue( static_cast<vtkIdType>( nColor ), rgb, rgb, rgb, 1.0 );
Perhaps you can use this with vtkLookupTable::GetColorValue() / SetColorValue() to change the opacity on the fly.