[英]How do I get the right coordinates in VTK
我目前正在尝试在 VTK 中获取“LeftButtonPressEvent”的鼠标坐标。 我分两种读法。第一种情况,我使用Picker进行转换,其次,我使用DisplayToWorld。 但是结果好像是两种方式读出来的结果不一样,可能我知道第一次读出来的结果是对的,但是不知道为什么第二次读出来会有偏差,大家跟我有过类似的困扰请告知,我找了很多资料,结果没有得到我想要的结果,两者的解释结果的来源应该是一样的。这是代码,我使用的 VTK9.0.0 版本 如果要运行代码,可能需要 DICOM 文件
import vtkmodules.all as vtk
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication, QGridLayout, QLabel
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import sys
class Flat(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.vtk_window = VtkWindow(self)
# self.vtk_window_2 = VtkWindow(self)
layout = QGridLayout()
self.setLayout(layout)
layout.addWidget(self.vtk_window)
# layout.addWidget(self.vtk_window_2)
class VtkWindow(QVTKRenderWindowInteractor):
def __init__(self, parent=None):
super().__init__(parent)
self.action = 'scale_image'
path_dicom = r'C:\Users\AOC\PycharmProjects\VR\vtk_image\ct\1.3.12.2.1107.5.1.4.115586.30000020010800583988700007056.dcm'
# read
self.reader = vtk.vtkDICOMImageReader()
self.reader.SetFileName(path_dicom)
self.reader.Update()
# actor
self.actor = vtk.vtkImageActor()
self.actor.SetInputData(self.reader.GetOutput())
# render
self.ren = vtk.vtkRenderer()
self.ren.AddActor(self.actor)
self.GetRenderWindow().AddRenderer(self.ren)
outline_data = vtk.vtkOutlineFilter()
outline_data.SetInputConnection(self.reader.GetOutputPort())
map_outline = vtk.vtkPolyDataMapper()
map_outline.SetInputConnection(outline_data.GetOutputPort())
outline = vtk.vtkActor()
outline.SetMapper(map_outline)
outline.GetProperty().SetColor(0, 1, 0)
self.ren.AddActor(outline)
# picker
self.picker = vtk.vtkPointPicker()
self.SetPicker(self.picker)
# callback listens to MouseMoveEvent invoked by the interactor's style
style = vtk.vtkInteractorStyleImage()
self.SetInteractorStyle(style)
style.AddObserver(vtk.vtkCommand.LeftButtonPressEvent, lambda *args: self.left_button_press_callback(*args))
################################
#############################
#################################
self.GetRenderWindow().Render()
self.Initialize()
def left_button_press_callback(self, *args):
position = self.GetEventPosition()
print("press_position", position)
self.picker.Pick(position[0], position[1], 0, self.ren)
world_pos = [self.picker.GetPickPosition()[0], self.picker.GetPickPosition()[1]]
world_pos1 = self.get_world_point_pos(position)
print("press_world_pos", world_pos)
print("press_world_pos1", world_pos1)
def get_world_point_pos(self, position=[0, 0]):
"""
:param position: eventPosition()
:return: world_point_pos
"""
self.ren.SetDisplayPoint(position[0], position[1], 0)
self.ren.DisplayToWorld()
print("self.ren.GetWorldPoint()", self.ren.GetWorldPoint())
return [self.ren.GetWorldPoint()[0], self.ren.GetWorldPoint()[1]]
class Form(QMainWindow):
def __init__(self):
super(Form, self).__init__()
self.flat = Flat(self)
self.setCentralWidget(self.flat)
self.resize(800, 800)
self.move(800, 100)
self.show()
# #
def closeEvent(self, event):
self.flat.vtk_window.Finalize()
# self.flat.vtk_window_2.Finalize()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = Form()
app.exec_()
虽然我可以使用 Picker 来获取正确的坐标,但是使用 Picker 会影响到我后续的代码,所以想知道除了 picker 怎么才能获取到正确的坐标。 我想可能是我缺了哪一边,但我不知道问题出在哪里。 谢谢。 我不知道如何直接显示这些图片,对不起,只能使用链接
问题已经被我解决了,把vtkPointPicker改成vtkPropPicker就可以解决了,但是我还是不知道为什么渲染器变换的方法不可行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.