2026/4/16 22:44:31
网站建设
项目流程
重庆网站建设 重庆网站制作,网络规划设计师考试考点分析网盘,elision豪华级创意企业wordpress,成都市成华区建设路商务中心网站一#xff1a;主要的知识点
1、说明
本文只是教程内容的一小段#xff0c;因博客字数限制#xff0c;故进行拆分。主教程链接#xff1a;vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①actor的位置、方向和尺寸的控制方式…一主要的知识点1、说明本文只是教程内容的一小段因博客字数限制故进行拆分。主教程链接vtk教程——逐行解析官网所有Python示例-CSDN博客2、知识点纪要本段代码主要涉及的有①actor的位置、方向和尺寸的控制方式②window包含多个render③多层render的选择交互二代码及注释import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkCubeSource from vtkmodules.vtkRenderingCore import vtkActor, vtkRenderer, vtkRenderWindow, vtkPolyDataMapper, vtkProperty, \ vtkRenderWindowInteractor from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkRenderingAnnotation import vtkAxesActor def select_layer(caller, ev): iren caller renderers iren.GetRenderWindow().GetRenderers() if renderers.GetNumberOfItems() 2: print(We need at least two renderers, we have only, renderers.GetNumberOfItems()) return # 初始化集合遍历 renderers.InitTraversal() ren0 renderers.GetNextItem() ren1 renderers.GetNextItem() 用于获取用户按下的键盘按键的符号名称 key iren.GetKeySym() if key in [0, KP_0]: # 如果是主键盘的0或者小键盘的KP_0 print(Selected layer:, key) 获取当前的鼠标交互样式对象 (vtkInteractorStyleTrackballCamera)并将其默认操作的渲染器设置为 ren0 意味着从调用这行代码开始用户通过鼠标和键盘进行的所有相机操作旋转、平移、缩放都将只作用于 ren0 这个渲染器的相机 iren.GetRenderWindow().GetInteractor().GetInteractorStyle().SetDefaultRenderer(ren0) # iren.GetInteractorStyle().SetDefaultRenderer(ren0) # 简便写法 ren0.InteractiveOn() ren1.InteractiveOff() if key in [1, KP_1]: print(Selected layer:, key) iren.GetRenderWindow().GetInteractor().GetInteractorStyle().SetDefaultRenderer(ren1) # iren.GetInteractorStyle().SetDefaultRenderer(ren1) # 简便写法 ren0.InteractiveOff() ren1.InteractiveOn() def orient_layer(caller, ev): 在用户完成对某一层的操作后立即将该层相机的新视角即方向和位置复制给另一层 从而保证两个层中的对象始终保持完全相同的朝向 iren caller renderers iren.GetRenderWindow().GetRenderers() if renderers.GetNumberOfItems() 2: print(We need at least two renderers, we have only, renderers.GetNumberOfItems()) return renderers.InitTraversal() ren0 renderers.GetNextItem() ren1 renderers.GetNextItem() if ren1.GetInteractive(): orient1 get_orientation(ren1) set_orientation(ren0, orient1) ren0.ResetCamera() else: orient0 get_orientation(ren0) set_orientation(ren1, orient0) ren1.ResetCamera() def get_orientation(ren): p dict() camera ren.GetActiveCamera() p[position] camera.GetPosition() p[focal point] camera.GetFocalPoint() p[view up] camera.GetViewUp() p[distance] camera.GetDistance() p[clipping range] camera.GetClippingRange() p[orientation] camera.GetOrientation() return p def set_orientation(ren, p): camera ren.GetActiveCamera() camera.SetPosition(p[position]) camera.SetFocalPoint(p[focal point]) camera.SetViewUp(p[view up]) camera.SetDistance(p[distance]) camera.SetClippingRange(p[clipping range]) def main(): colors vtkNamedColors() cube_source vtkCubeSource() cube_source.SetCenter(0, 0, 0, ) cube_source.SetXLength(4) cube_source.SetYLength(9) cube_source.SetZLength(1) cube_mapper vtkPolyDataMapper() cube_mapper.SetInputConnection(cube_source.GetOutputPort()) back vtkProperty() back.SetColor(colors.GetColor3d(Sienna)) cube_actor vtkActor() cube_actor.SetMapper(cube_mapper) cube_actor.GetProperty().SetDiffuseColor(colors.GetColor3d(BurlyWood)) cube_actor.GetProperty().EdgeVisibilityOn() cube_actor.GetProperty().SetLineWidth(2) cube_actor.GetProperty().SetEdgeColor(colors.GetColor3d(PapayaWhip)) cube_actor.SetBackfaceProperty(back) vtk中actor的位置、方向和尺寸可以通过两种方式控制 1、内部变换 actor自身提供的方法如SetPosition, RotateX/Y/ZSetScale等 2、外部变换 使用SetUserTransform(vtkTransform) transform vtkTransform() transform.Translate(0, 0, 0) axes vtkAxesActor() axes.SetUserTransform(transform) renderers list() ren_win vtkRenderWindow() ren_win.SetSize(800, 800) ren_win.SetWindowName(LayeredActors) iren vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) style vtkInteractorStyleTrackballCamera() iren.SetInteractorStyle(style) for i in range(0, 2): renderers.append(vtkRenderer()) ren_win.AddRenderer(renderers[i]) SetLayer 一个 vtkRenderWindow 可以包含多个 vtkRenderer 每个 Renderer 都可以在不同的层layer上绘制。层的顺序决定谁在上面、谁在下面 层号从0开始层号越大越靠上。 通常只有底层(Layer 0)的背景是可见的对于i0的层如果它们没有显示地设置背景颜色又或者 它们的演员没有完全覆盖其视口区域那么它们将是透明的 renderers[i].SetLayer(i) renderers[0].SetBackground(colors.GetColor3d(DarkSlateGray)) renderers[0].AddActor(cube_actor) # renderers[0].SetLayer(0) # 重复代码 renderers[1].AddActor(axes) renderers[1].SetBackground(colors.GetColor3d(MidnightBlue)) # renderers[1].SetLayer(1) # 重复代码 for renderer in renderers: camera renderer.GetActiveCamera() camera.Elevation(-30) camera.Azimuth(-30) renderer.ResetCamera() renderWindow也要设置层级数目与render对应 ren_win.SetNumberOfLayers(len(renderers)) ren_win.Render() iren.AddObserver(KeyPressEvent, select_layer) iren.AddObserver(EndInteractionEvent, orient_layer) iren.Start() if __name__ __main__: main()