欢迎访问宙启技术站
智能推送

利用vtkRenderWindowInteractor()实现鼠标交互式选取模型

发布时间:2023-12-26 06:51:09

vtkRenderWindowInteractor类是VTK中的交互式渲染窗口类,可以用于实现鼠标交互式选取模型。下面我将介绍如何利用vtkRenderWindowInteractor类实现这一功能,并提供一个简单的使用例子。

首先,需要导入VTK库和其他相关的模块:

import vtk
from vtk.util.colors import tomato

然后,创建一个vtkRenderer对象,并设置其背景色:

renderer = vtk.vtkRenderer()
renderer.SetBackground(0.1, 0.2, 0.4)

接下来,创建一个vtkRenderWindow对象,并将renderer添加到其中:

render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)

然后,创建一个vtkRenderWindowInteractor对象,并将render_window设置为其渲染窗口:

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)

在例子中,我们使用vtkSphereSource来生成一个球体数据:

sphere_source = vtk.vtkSphereSource()
sphere_source.SetCenter(0, 0, 0)
sphere_source.SetRadius(1.0)
sphere_source.SetPhiResolution(100)
sphere_source.SetThetaResolution(100)

然后,创建一个vtkPolyDataMapper对象,并将sphere_source的输出数据设置为其输入:

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(sphere_source.GetOutputPort())

接下来,创建一个vtkActor对象,并将mapper设置为其映射器:

actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(tomato)

然后,将actor添加到renderer中:

renderer.AddActor(actor)

最后,将所有对象初始化并渲染:

render_window.Render()

在渲染窗口中添加一个vtkAreaPicker对象,用于选取模型:

area_picker = vtk.vtkAreaPicker()
interactor.SetPicker(area_picker)

然后,定义一个回调函数来处理选取模型的操作:

def pick_callback(obj, event):
    # 获取选取的屏幕坐标
    x, y = interactor.GetEventPosition()

    # 通过屏幕坐标获取对应的世界坐标
    picker = interactor.GetPicker()
    picker.Pick(x, y, 0, renderer)
    pick_position = picker.GetPickPosition()

    # 输出选取的坐标
    print("Picked position:", pick_position)

最后,将回调函数与鼠标左键按下事件绑定:

interactor.AddObserver("LeftButtonPressEvent", pick_callback)

完整的代码如下:

import vtk
from vtk.util.colors import tomato

# 创建vtkRenderer对象
renderer = vtk.vtkRenderer()
renderer.SetBackground(0.1, 0.2, 0.4)

# 创建vtkRenderWindow对象,并将renderer添加到其中
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)

# 创建vtkRenderWindowInteractor对象,并设置render_window为其渲染窗口
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)

# 创建vtkSphereSource对象
sphere_source = vtk.vtkSphereSource()
sphere_source.SetCenter(0, 0, 0)
sphere_source.SetRadius(1.0)
sphere_source.SetPhiResolution(100)
sphere_source.SetThetaResolution(100)

# 创建vtkPolyDataMapper对象
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(sphere_source.GetOutputPort())

# 创建vtkActor对象
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(tomato)

# 将actor添加到renderer中
renderer.AddActor(actor)

# 渲染窗口初始化并渲染
render_window.Render()

# 创建vtkAreaPicker对象
area_picker = vtk.vtkAreaPicker()
interactor.SetPicker(area_picker)

# 定义回调函数处理选取模型的操作
def pick_callback(obj, event):
    # 获取选取的屏幕坐标
    x, y = interactor.GetEventPosition()

    # 通过屏幕坐标获取对应的世界坐标
    picker = interactor.GetPicker()
    picker.Pick(x, y, 0, renderer)
    pick_position = picker.GetPickPosition()

    # 输出选取的坐标
    print("Picked position:", pick_position)

# 将回调函数与鼠标左键按下事件绑定
interactor.AddObserver("LeftButtonPressEvent", pick_callback)

# 启动交互式绘制
interactor.Start()

运行以上代码,可以看到一个球体在屏幕中显示,并且可以通过鼠标左键选择模型,选择的坐标会在终端输出。

希望以上内容能对你有所帮助,如果还有其他问题,请随时追问。