我目前正在尝试获取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之外如何才能获得正确的坐标。我想可能是我缺少了哪一面,但我不知道问题出在哪里。谢谢 我不知道如何直接显示这些图片,对不起,只能使用链接
That's the first way I get the coordinatesThat's the second way I get the coordinates
问题已经由我解决了,将vtkPointPicker更改为vtkPropPicker将解决问题,但我仍然不知道为什么渲染器变换方法不可行
相关问题 更多 >
编程相关推荐