My goal is to have an object (a compass) that I can put at the top of my ParaView animation to
always show the direction of view.
I’ve tried a couple of ways I thought this might work, but have yet to find a workable solution.
First I tried to put the compass in it’s own RenderView and use a LiveProgrammableSource with a quick-timer rerender to copy the camera orientation (but not location) from one view to the other. And while I can get the orientation copied once, it doesn’t work on a continual basis.
(For this I used the timing script from: update automatic data input)
So then I thought a better solution might just be to translate the compass to “follow” the camera,
and reposition it in front of the camera (and up a little) whenever the camera moves. For this,
I can’t use a source, so I use the ProgrammableFilter, which doesn’t have the “Live” option.
So I can gert this to work – once – but I don’t know a way to make it happen all the time. Ideally
I’d like it to work continually, including when I move the camera with the mouse in the RenderView.
But I’d be happy if I could figure out a way to trigger the ProgrammableFilter on an ongoing basis.
Is there a way to use the ResquestUpdateExtent script option?
ASIDE: as I mentioned, my ideal would be to have a script that executes while I’m changing
the camera view with the mouse, but even the LiveProgrammableSource freezes whenever
the mouse is engaged.
FYI: here’s the “Script” portion that I’m using for the PrrogrammableFilter to move my compass:
# moveToCam.py from paraview import servermanager from vtk.vtkCommonTransforms import vtkTransform from vtk.vtkFiltersGeneral import vtkTransformPolyDataFilter import operator import numpy as np pdi = self.GetPolyDataInput() pdo = self.GetPolyDataOutput() # Get information about the main (current) camera view = servermanager.GetRenderView() camera = view.GetActiveCamera() # Calculate a location that's in front of the camera (with minor adjustments) camLocation = camera.GetPosition() dirVector = tuple(map(operator.sub, camera.GetFocalPoint(), camLocation)) normDir = dirVector / np.linalg.norm(dirVector) newLocation = camLocation + normDir * 100 + [0.0, -15.0, 0.0] # Create a tranformation object that moves objects to be in front of the camera # as well as doing a scaling operation. transform = vtkTransform() transform.Translate(newLocation) transform.Scale(10.0, 10.0, 10.0) # Create the poly data filter that uses the above transform transformPD = vtkTransformPolyDataFilter() transformPD.SetTransform(transform) transformPD.SetInputData(pdi) transformPD.Update() # Apply the transform to the output (via the Poly Data Filter) pdo.ShallowCopy(transformPD.GetOutput())