一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①选择对象并高亮显示
二:代码及注释
import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonCore import vtkMinimalStandardRandomSequence from vtkmodules.vtkRenderingCore import vtkActor, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, \ vtkPropPicker, vtkPolyDataMapper from vtkmodules.vtkFiltersHybrid import vtkPolyDataSilhouette from vtkmodules.vtkFiltersSources import vtkSphereSource from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera class MouseInteractorHighLightActor(vtkInteractorStyleTrackballCamera): def __init__(self, silhouette=None, silhouetteActor=None): self.AddObserver("LeftButtonPressEvent", self.onLeftButtonDown) self.LastPickedActor = None self.Silhouette = silhouette self.SilhouetteActor = silhouetteActor def onLeftButtonDown(self, obj, event): clickPos = self.GetInteractor().GetEventPosition() picker = vtkPropPicker() picker.Pick(clickPos[0], clickPos[1], 0, self.GetDefaultRenderer()) self.LastPickedActor = picker.GetActor() if self.LastPickedActor: self.GetDefaultRenderer().RemoveActor(self.SilhouetteActor) # 清除渲染器中当前显示的轮廓线 self.Silhouette.SetInputData(self.LastPickedActor.GetMapper().GetInput()) self.GetDefaultRenderer().AddActor(self.SilhouetteActor) self.OnLeftButtonDown() def main(): numberOfSpheres = 10 colors = vtkNamedColors() renderer = vtkRenderer() renderer.SetBackground(colors.GetColor3d('SteelBlue')) renderWindow = vtkRenderWindow() renderWindow.SetSize(640, 480) renderWindow.AddRenderer(renderer) interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) randomSequence = vtkMinimalStandardRandomSequence() randomSequence.SetSeed(8775070) for i in range(numberOfSpheres): source = 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 = vtkPolyDataMapper() mapper.SetInputConnection(source.GetOutputPort()) actor = 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(0.8) actor.GetProperty().SetSpecular(0.5) actor.GetProperty().SetSpecularColor(colors.GetColor3d('White')) actor.GetProperty().SetSpecularPower(30.0) renderer.AddActor(actor) renderWindow.Render() """ vtkPolyDataSilhouette 是一个几何特征可视化类,用来生成并显示一个模型的轮廓线 即——从某个视点或光源方向看去,模型边缘的可见轮廓线 """ silhouette = vtkPolyDataSilhouette() silhouette.SetCamera(renderer.GetActiveCamera()) # 指定相机,用来计算哪些属于轮廓 silhouetteMapper = vtkPolyDataMapper() silhouetteMapper.SetInputConnection(silhouette.GetOutputPort()) silhouetteActor = vtkActor() silhouetteActor.SetMapper(silhouetteMapper) silhouetteActor.GetProperty().SetColor(colors.GetColor3d("Tomato")) silhouetteActor.GetProperty().SetLineWidth(5) style = MouseInteractorHighLightActor(silhouette, silhouetteActor) style.SetDefaultRenderer(renderer) interactor.Initialize() interactor.SetInteractorStyle(style) renderWindow.SetWindowName('HighlightWithSilhouette') renderWindow.Render() interactor.Start() if __name__ == '__main__': main()