Manage to figure out my own solution. There might be better ways out there but I am unaware of them at this stage.
This is what I have done:
I have a renderer for each actor. I then set the window centre for each renderer so that they do not overlap one another.
e.g. vtkRenderer->GetActiveCamera()->SetWindowCenter(0.5, 0);
Then I added an vtkCommand::InteractionEvent
observer to vtkInteractorStyleTrackballCamera.
The callback method of the observer:
void TrackballRotateEvent(vtkObject* obj, unsigned long eid, void* clientdata, void* calldata)
{
if ((m_ViewMode != E3DVIEWMODE::CAMERA_SYNC)|| (m_pvtkTrackballInteractorStyle->GetState() != VTKIS_ROTATE))
return;
vtkSmartPointer < vtkRenderer > curRenderer = m_pvtkTrackballInteractorStyle->GetCurrentRenderer();
for (size_t i = 0; i < m_3DImageVec.size(); ++i) {
//Rotate all other renderers
if (m_3DImageVec[i].m_pvtkRenderer != curRenderer) {
m_pvtkTrackballInteractorStyle->SetDefaultRenderer(m_3DImageVec[i].m_pvtkRenderer); //must set the default renderer before setting
m_pvtkTrackballInteractorStyle->SetCurrentRenderer(m_3DImageVec[i].m_pvtkRenderer); //the current renderer otherwise it will have no affect
m_pvtkTrackballInteractorStyle->Rotate(); //This is basically what is used to rotate the object according to the mouse move event
}
}
//set back to original renderer
m_pvtkTrackballInteractorStyle->SetDefaultRenderer(curRenderer);
m_pvtkTrackballInteractorStyle->SetCurrentRenderer(curRenderer);
}
As you can see that I then simply call Rotate on the Style after swapping out renderers. This allows all actors to rotate synchronously. Note: I have complete access to the main object within the callback method above.
The advantage here is that I can simply change the view mode and it is then possible to rotate only the selected actor.