Python VTK高亮显示actor
派大大大星 人气:0前言:
VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。
主要函数介绍:
NewPickedActor.GetProperty(): 通过该函数,可以设置actor的性质,如颜色、表面样式等。
vtk.vtkSphereSource(): 创建球体的函数,文中通过一个for循环创建了10个球体。
vtk.vtkMinimalStandardRandomSequence(): VTK的随机数生成器,用于代码中的十个球体,随机生成球体的大小和位置。
MouseInteractorHighLightActor: 定义actor操作方法,这个是一个鼠标操作控件的控制方法。
leftButtonPressEvent(self, obj, event): 这是一个事件触发函数,当鼠标左键点击对应的actor时,会触发函数,对点的actor高亮显示。
主要代码如下:
#!/usr/bin/env python # noinspection PyUnresolvedReferences import vtk colors = vtk.vtkNamedColors() NUMBER_OF_SPHERES = 10 class MouseInteractorHighLightActor(vtk.vtkInteractorStyleTrackballCamera): def __init__(self, parent=None): self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent) self.LastPickedActor = None self.LastPickedProperty = vtk.vtkProperty() def leftButtonPressEvent(self, obj, event): clickPos = self.GetInteractor().GetEventPosition() picker = vtk.vtkPropPicker() picker.Pick(clickPos[0], clickPos[1], 0, self.GetDefaultRenderer()) # 创建一个新的actor self.NewPickedActor = picker.GetActor() # If something was selected if self.NewPickedActor: # If we picked something before, reset its property if self.LastPickedActor: self.LastPickedActor.GetProperty().DeepCopy(self.LastPickedProperty) # Save the property of the picked actor so that we can # restore it next time self.LastPickedProperty.DeepCopy(self.NewPickedActor.GetProperty()) # 高亮选中球体,并显示边缘 self.NewPickedActor.GetProperty().SetColor(colors.GetColor3d('Red')) self.NewPickedActor.GetProperty().SetDiffuse(1.0) self.NewPickedActor.GetProperty().SetSpecular(0.0) self.NewPickedActor.GetProperty().EdgeVisibilityOn() # 保存最后一个选中的actor self.LastPickedActor = self.NewPickedActor self.OnLeftButtonDown() return def main(): # 创建render和window renderer = vtk.vtkRenderer() renderer.SetBackground(colors.GetColor3d('SteelBlue')) renwin = vtk.vtkRenderWindow() renwin.AddRenderer(renderer) renwin.SetSize(640, 480) renwin.SetWindowName('HighlightPickedActor') # 建立interactor(交互操作) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renwin) # 交互操作方法 style = MouseInteractorHighLightActor() style.SetDefaultRenderer(renderer) interactor.SetInteractorStyle(style) randomSequence = vtk.vtkMinimalStandardRandomSequence() # randomSequence.SetSeed(1043618065) # randomSequence.SetSeed(5170) randomSequence.SetSeed(8775070) # 添加球体 for i in range(NUMBER_OF_SPHERES): source = vtk.vtkSphereSource() # random position and radius x = randomSequence.GetRangeValue(-5.0, 5.0) randomSequence.Next() y = randomSequence.GetRangeValue(-5.0, 5.0) randomSequence.Next() z = randomSequence.GetRangeValue(-5.0, 5.0) randomSequence.Next() radius = randomSequence.GetRangeValue(0.5, 1.0) randomSequence.Next() source.SetRadius(radius) source.SetCenter(x, y, z) source.SetPhiResolution(11) source.SetThetaResolution(21) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(source.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) r = randomSequence.GetRangeValue(0.4, 1.0) randomSequence.Next() g = randomSequence.GetRangeValue(0.4, 1.0) randomSequence.Next() b = randomSequence.GetRangeValue(0.4, 1.0) randomSequence.Next() actor.GetProperty().SetDiffuseColor(r, g, b) actor.GetProperty().SetDiffuse(.8) actor.GetProperty().SetSpecular(.5) actor.GetProperty().SetSpecularColor(colors.GetColor3d('White')) actor.GetProperty().SetSpecularPower(30.0) renderer.AddActor(actor) # 运行 interactor.Initialize() renwin.Render() interactor.Start() if __name__ == '__main__': main()
显示结果如下: 未选择球体:
已选取球体后:
加载全部内容