It seems vtkCellPicker suffers from the same problem (OS X and VTK 9.1), see code below. The picker returns the wrong world position.
import sys
import math
import vtk
from PySide6 import QtWidgets
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent = None):
QtWidgets.QMainWindow.__init__(self, parent)
self.frame = QtWidgets.QFrame()
self.vl = QtWidgets.QVBoxLayout()
self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.picker = vtk.vtkCellPicker() #vtkPropPicker()
# Create source
source = vtk.vtkSphereSource()
# Create a mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
# Create an actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
self.ren.AddActor(actor)
self.ren.ResetCamera()
# self.iren.SetPicker(self.picker)
self.vl.addWidget(self.vtkWidget)
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.AddObserver("LeftButtonPressEvent", self.onclick)
self.iren.Initialize()
self.iren.Start()
def onclick(self, iren, event):
x, y = self.iren.GetEventPosition()
print("Left button pressed at", x,y)
cellId = self.picker.Pick(x, y, 0, self.ren)
if cellId >= 0:
xyz = self.picker.GetPickPosition()
radius = math.sqrt(xyz[0]**2 + xyz[1]**2 + xyz[2]**2)
print(f" 3d picked pt {xyz} radius: {radius} ")
source = vtk.vtkSphereSource()
source.SetRadius(0.02)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(1,0,0)
actor.SetPosition(xyz)
self.ren.AddActor(actor)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Depending on where you pick, you might see something like
Left button pressed at 150 172
3d picked pt (0.19066947142160784, -0.22312961309267365, -0.3825671026006565) radius: 0.48218177025198994
(The radius should be close to 1.)