I am working with two actors in a 3D scene, where I need one actor (highlightActor) to always appear on top of another actor (currentActor), even when they are in close proximity or overlapping. Currently, I’m facing Z-fighting issues in certain views, where the two actors seem to compete for visibility, especially when viewed from different camera angles.
I have tried using the following approaches to resolve the issue:
While this works in some views, it doesn’t entirely solve the problem as the highlightActor sometimes still appears behind the other actor, depending on the camera angle.
Like this:
I would like to know if there is a more reliable method in VTK to ensure that one actor always renders on top of another, regardless of camera angle or geometry.
You can try adding a second renderer to your render window:
_rendererMainScene = vtkSmartPointer<vtkRenderer>::New();
(...)
_rendererForeground = vtkSmartPointer<vtkRenderer>::New();
// Foreground renderer will use the same camera of the main renderer
_rendererForeground->SetActiveCamera( _rendererMainScene->GetActiveCamera() );
/* Renderers assigned to layers greater than zero have no background and
are rendered last. */
_rendererForeground->SetLayer( 1 );
(...)
_vtkwidget->renderWindow()->AddRenderer(_rendererMainScene);
_vtkwidget->renderWindow()->AddRenderer(_rendererForeground);
This way, actors added to _renderedForeground will always be on top of those added to _rendererMainScene.
Thanks a lot for your suggestion — adding a second renderer with different layers is a clever idea.
However, I’d prefer not to set up separate interactors for each renderer. My goal is to maintain a single interactor for user input handling, as managing multiple interactors complicates the interaction logic in my application. What I actually want to do is to make sure that the two actors do not interfere with each other:
In the above code, I’m pulling the highlight actor out of the screen and pushing the current mapper into the screen. The actual values for the parameters depend on your scene but in general,
offset (first parameter) is dominant when looking at the geometry face down
factor (second parameter) is dominant when looking at the geometry from the size (aka edge on).