I have a cylinder, and I want to translate it with (0, 10, 0), and rotate it with 30 degree along x axis.
I can implement it as:
import vtkmodules.all as vtk
cylinder = vtk.vtkCylinderSource()
cylinder.SetCenter(0, 10, 0)
cylinder.SetRadius(5)
cylinder.SetHeight(10)
cylinder.Update()
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInputData(cylinder.GetOutput())
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
cylinderActor.GetProperty().SetOpacity(0.3)
cylinderActor.SetPosition(0, 10, 0)
cylinderActor.SetOrigin(0, 10, 0)
cylinderActor.RotateX(30)
line = vtk.vtkLineSource()
line.SetPoint1(0, 0, 0)
line.SetPoint2(0, 20, 0)
line.Update()
lineMapper = vtk.vtkPolyDataMapper()
lineMapper.SetInputData(line.GetOutput())
lineActor = vtk.vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(1, 0, 0)
renderer = vtk.vtkRenderer()
renderer.AddActor(cylinderActor)
renderer.AddActor(lineActor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
iren.Initialize()
iren.Start()
And the result is:

The endpoint of line is (0, 0, 0) and (0, 20, 0). The original center of cylinder is (0, 10, 0), after SetPosition, the center is (0, 20, 0).
Question1: How to reset the actor? If actor.RotateX(30) after actor.RotateX(40), the actor is actually rotate 70 degree. Is there a actor->Reset() method, so that actor.RotateX(30) only rotate 30 degree rather than 30+40 degree.
Question 2: How can I achieve the same result using vtkTransform?
I modify the following code:
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInputData(cylinder.GetOutput())
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
cylinderActor.GetProperty().SetOpacity(0.3)
cylinderActor.SetPosition(0, 10, 0)
cylinderActor.SetOrigin(0, 10, 0)
cylinderActor.RotateX(30)
to
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInputData(cylinder.GetOutput())
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
cylinderActor.GetProperty().SetOpacity(0.3)
transform = vtk.vtkTransform()
transform.Translate(0, -10, 0) # translate the original center (0, 10, 0) to (0, 0, 0)
transform.RotateX(30) # rotate
transform.Translate(0, 10, 0) # translate the center (0, 0, 0) to original center (0, 10, 0)
transform.Translate(0, 10, 0) # translate the center (0, 10, 0) to (0, 20, 0)
cylinderActor.SetUserTransform(transform)
But the result is:

What’s wrong with my vtkTransform code?
Question 3: transform.RotateX(30) what is the point about which all rotations take place? actor.SetOrigin() would set this point. But, what is this point for transform.RotateX()? Is this point (0, 0, 0)?
Any suggestion is appreciated~~~