# vtkCellpicker return original position after rotate actor

**URL:** https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894
**Category:** Support
**Tags:** python
**Created:** [July 31, 2025, 10:36am UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894 "2025-07-31T10:36:48Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Xu\_Zhang](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/x/2acd7d/32.png) [@Xu\_Zhang](https://discourse.vtk.org/u/Xu_Zhang)
#### Post date: [July 31, 2025, 10:36am UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894/1 "2025-07-31T10:36:48Z")

</div>

in the CellPicking.py example, I rotate the actor. Now the picked cell is the original one, not the rotated. It seems the polydata of the vtkactor is un-rotated.

This is the result of the example, without rotating actor.

 ![Screenshot 2025-07-31 at 18.33.50](https://discourse.vtk.org/uploads/default/original/2X/d/dc3a28715def054456a01136bf1504048a379713.png)

Here is the picking result after rotate actor

 ![Screenshot 2025-07-31 at 18.33.23](https://discourse.vtk.org/uploads/default/original/2X/e/e584973d21e192d4b7c59ad4789556815dce2b19.png)

The python code to rotate the actor:

```
actor.RotateZ(30)
actor.RotateY(30)

```

What is wrong? Should I change picking or change the actor or mapper ?

source code of Cellpicking.py

```python
#!/usr/bin/env python

# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkIdTypeArray
from vtkmodules.vtkCommonDataModel import (
    vtkSelection,
    vtkSelectionNode,
    vtkUnstructuredGrid
)
from vtkmodules.vtkFiltersCore import vtkTriangleFilter
from vtkmodules.vtkFiltersExtraction import vtkExtractSelection
from vtkmodules.vtkFiltersSources import vtkPlaneSource
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkCellPicker,vtkPicker, vtkPropPicker, vtkWorldPointPicker,
    vtkDataSetMapper,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

# Catch mouse events
class MouseInteractorStyle(vtkInteractorStyleTrackballCamera):
    def __init__ (self, data):
        self.AddObserver('LeftButtonPressEvent', self.left_button_press_event)
        self.data = data
        self.selected_mapper = vtkDataSetMapper()
        self.selected_actor = vtkActor()

    def left_button_press_event(self, obj, event):
        colors = vtkNamedColors()

        # Get the location of the click (in window coordinates)
        pos = self.GetInteractor().GetEventPosition()

        picker = vtkCellPicker()
        # picker = vtkPropPicker()
        # picker = vtkWorldPointPicker()
        picker.SetTolerance(0.0005)

        # Pick from this location.
        picker.Pick(pos[0], pos[1], 0, self.GetDefaultRenderer())

        world_position = picker.GetPickPosition()
        print(f'Cell id is: {picker.GetCellId()}')

        if picker.GetCellId() != -1:
            print(f'Pick position is: ({world_position[0]:.6g}, {world_position[1]:.6g}, {world_position[2]:.6g})')

            ids = vtkIdTypeArray()
            ids.SetNumberOfComponents(1)
            ids.InsertNextValue(picker.GetCellId())

            selection_node = vtkSelectionNode()
            selection_node.SetFieldType(vtkSelectionNode.CELL)
            selection_node.SetContentType(vtkSelectionNode.INDICES)
            selection_node.SetSelectionList(ids)

            selection = vtkSelection()
            selection.AddNode(selection_node)

            extract_selection = vtkExtractSelection()
            extract_selection.SetInputData(0, self.data)
            extract_selection.SetInputData(1, selection)
            extract_selection.Update()

            # In selection
            selected = vtkUnstructuredGrid()
            selected.ShallowCopy(extract_selection.GetOutput())

            print(f'Number of points in the selection: {selected.GetNumberOfPoints()}')
            print(f'Number of cells in the selection : {selected.GetNumberOfCells()}')

            self.selected_mapper.SetInputData(selected)
            self.selected_actor.SetMapper(self.selected_mapper)
            self.selected_actor.GetProperty().EdgeVisibilityOn()
            self.selected_actor.GetProperty().SetColor(colors.GetColor3d('Tomato'))

            print(self.selected_actor.GetPosition())
            self.selected_actor.GetProperty().SetLineWidth(3)

            self.GetInteractor().GetRenderWindow().GetRenderers().GetFirstRenderer().AddActor(self.selected_actor)

        # Forward events
        self.OnLeftButtonDown()

def main(argv):
    colors = vtkNamedColors()

    plane_source = vtkPlaneSource()

    plane_source.Update()

    triangle_filter = vtkTriangleFilter()
    triangle_filter.SetInputConnection(plane_source.GetOutputPort())
    triangle_filter.Update()

    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(triangle_filter.GetOutputPort())
    mapper.StaticOff()

    actor = vtkActor()
    actor.GetProperty().SetColor(colors.GetColor3d('SeaGreen'))
    actor.SetMapper(mapper)
    # rotate actor
    actor.RotateZ(30)
    actor.RotateY(30)

    print(actor.GetPosition())
    renderer = vtkRenderer()
    ren_win = vtkRenderWindow()
    ren_win.AddRenderer(renderer)
    ren_win.SetWindowName('CellPicking')
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(ren_win)

    renderer.AddActor(actor)
    # renderer.ResetCamera()
    renderer.SetBackground(colors.GetColor3d('PaleTurquoise'))

    # Add the custom style.
    # style = MouseInteractorStyle(triangle_filter.GetOutput())
    style = MouseInteractorStyle(actor.GetMapper().GetInput())

    style.SetDefaultRenderer(renderer)
    iren.SetInteractorStyle(style)

    ren_win.Render()
    iren.Initialize()
    iren.Start()

if __name__ == ' __main__':
    import sys

    main(sys.argv)
```

---

<div class="post-metadata">

### Author: ![Xu\_Zhang](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/x/2acd7d/32.png) [@Xu\_Zhang](https://discourse.vtk.org/u/Xu_Zhang)
#### Post date: [July 31, 2025, 10:48am UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894/3 "2025-07-31T10:48:09Z")

</div>

```python
#!/usr/bin/env python

# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkIdTypeArray
from vtkmodules.vtkCommonDataModel import (
    vtkSelection,
    vtkSelectionNode,
    vtkUnstructuredGrid
)
from vtkmodules.vtkFiltersCore import vtkTriangleFilter
from vtkmodules.vtkFiltersExtraction import vtkExtractSelection
from vtkmodules.vtkFiltersSources import vtkPlaneSource
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkCellPicker,vtkPicker, vtkPropPicker, vtkWorldPointPicker,
    vtkDataSetMapper,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

# Catch mouse events
class MouseInteractorStyle(vtkInteractorStyleTrackballCamera):
    def __init__ (self, data):
        self.AddObserver('LeftButtonPressEvent', self.left_button_press_event)
        self.data = data
        self.selected_mapper = vtkDataSetMapper()
        self.selected_actor = vtkActor()

    def left_button_press_event(self, obj, event):
        colors = vtkNamedColors()

        # Get the location of the click (in window coordinates)
        pos = self.GetInteractor().GetEventPosition()

        picker = vtkCellPicker()
        # picker = vtkPropPicker()
        # picker = vtkWorldPointPicker()
        picker.SetTolerance(0.0005)

        # Pick from this location.
        picker.Pick(pos[0], pos[1], 0, self.GetDefaultRenderer())

        world_position = picker.GetPickPosition()
        print(f'Cell id is: {picker.GetCellId()}')

        if picker.GetCellId() != -1:
            print(f'Pick position is: ({world_position[0]:.6g}, {world_position[1]:.6g}, {world_position[2]:.6g})')

            ids = vtkIdTypeArray()
            ids.SetNumberOfComponents(1)
            ids.InsertNextValue(picker.GetCellId())

            selection_node = vtkSelectionNode()
            selection_node.SetFieldType(vtkSelectionNode.CELL)
            selection_node.SetContentType(vtkSelectionNode.INDICES)
            selection_node.SetSelectionList(ids)

            selection = vtkSelection()
            selection.AddNode(selection_node)

            extract_selection = vtkExtractSelection()
            extract_selection.SetInputData(0, self.data)
            extract_selection.SetInputData(1, selection)
            extract_selection.Update()

            # In selection
            selected = vtkUnstructuredGrid()
            selected.ShallowCopy(extract_selection.GetOutput())

            print(f'Number of points in the selection: {selected.GetNumberOfPoints()}')
            print(f'Number of cells in the selection : {selected.GetNumberOfCells()}')

            self.selected_mapper.SetInputData(selected)
            self.selected_actor.SetMapper(self.selected_mapper)
            self.selected_actor.GetProperty().EdgeVisibilityOn()
            self.selected_actor.GetProperty().SetColor(colors.GetColor3d('Tomato'))

            print(self.selected_actor.GetPosition())
            self.selected_actor.GetProperty().SetLineWidth(3)

            self.GetInteractor().GetRenderWindow().GetRenderers().GetFirstRenderer().AddActor(self.selected_actor)

        # Forward events
        self.OnLeftButtonDown()

def main(argv):
    colors = vtkNamedColors()

    plane_source = vtkPlaneSource()

    plane_source.Update()

    triangle_filter = vtkTriangleFilter()
    triangle_filter.SetInputConnection(plane_source.GetOutputPort())
    triangle_filter.Update()

    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(triangle_filter.GetOutputPort())
    mapper.StaticOff()

    actor = vtkActor()
    actor.GetProperty().SetColor(colors.GetColor3d('SeaGreen'))
    actor.SetMapper(mapper)

    actor.RotateZ(30)
    actor.RotateY(30)

    print(actor.GetPosition())
    renderer = vtkRenderer()
    ren_win = vtkRenderWindow()
    ren_win.AddRenderer(renderer)
    ren_win.SetWindowName('CellPicking')
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(ren_win)

    renderer.AddActor(actor)
    # renderer.ResetCamera()
    renderer.SetBackground(colors.GetColor3d('PaleTurquoise'))

    # Add the custom style.
    # style = MouseInteractorStyle(triangle_filter.GetOutput())
    style = MouseInteractorStyle(actor.GetMapper().GetInput())

    style.SetDefaultRenderer(renderer)
    iren.SetInteractorStyle(style)

    ren_win.Render()
    iren.Initialize()
    iren.Start()

if __name__ == ' __main__':
    import sys

    main(sys.argv)
```

---

<div class="post-metadata">

### Author: ![Sandor](https://discourse.vtk.org/user_avatar/discourse.vtk.org/sandor/32/9992_2.png) [@Sandor](https://discourse.vtk.org/u/Sandor)
#### Post date: [July 31, 2025, 2:21pm UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894/5 "2025-07-31T14:21:01Z")

</div>

Hi,

So on the first read apparently you are creating an actor on selection :

self.GetInteractor().GetRenderWindow().GetRenderers().GetFirstRenderer().AddActor(self.selected\_actor)

And your rotation command later is referring to this actor created by the selection, so your original polydata remains unchanged.

---

<div class="post-metadata">

### Author: ![Xu\_Zhang](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/x/2acd7d/32.png) [@Xu\_Zhang](https://discourse.vtk.org/u/Xu_Zhang)
#### Post date: [August 1, 2025, 6:54am UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894/6 "2025-08-01T06:54:41Z")

</div>

Hi,  
Thanks.  
This is the official example posted on VTK.  
[https://examples.vtk.org/site/Python/Picking/CellPicking/](https://examples.vtk.org/site/Python/Picking/CellPicking/)  
I rotate the actor after creating. I think I rotated the original polydata, which is the green one. It shows the original polydata hase been rotated. The Tomato color triangle is the selected actor, which is created by vtkExtractSelection(),

---

<div class="post-metadata">

### Author: ![Xu\_Zhang](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/x/2acd7d/32.png) [@Xu\_Zhang](https://discourse.vtk.org/u/Xu_Zhang)
#### Post date: [August 1, 2025, 6:57am UTC](https://discourse.vtk.org/t/vtkcellpicker-return-original-position-after-rotate-actor/15894/7 "2025-08-01T06:57:54Z")

</div>

```python
plane_source = vtkPlaneSource()

    plane_source.Update()

    triangle_filter = vtkTriangleFilter()
    triangle_filter.SetInputConnection(plane_source.GetOutputPort())
    triangle_filter.Update()

    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(triangle_filter.GetOutputPort())
    mapper.StaticOff()

    actor = vtkActor()
    actor.GetProperty().SetColor(colors.GetColor3d('SeaGreen'))
    actor.SetMapper(mapper)

# rotate the actor after creating it. This is not included in the official example.
    actor.RotateZ(30)
    actor.RotateY(30)
```
