vtk学习笔记

作者: 升不上三段的大鱼 | 来源:发表于2021-06-01 18:02 被阅读0次

    1. vtk简介

    VTK全称Visualization ToolKit,是一个开源的计算机图形学工具,可以用来实现图像处理和可视化、建模等。

    2. vtk流程

    绘制几何体的流程:

    • Source/Data:创建内容,需要可视化的几何体等

    • Mapper:把vtk的数据传给openGL

    • Actor:把前面准备的几何体造出来

    • Render:将图形渲染出来,在窗口中展示出来

    • Window:设置对应窗口的操作,比如旋转

    • Interactor:与窗口的交互设置

    绘制图片的流程:

    • Reader:读入图片
    • Filter:对图像进行处理
    • Viewer:展示处理过的图片

    vtk的pipeline的实现是通过对前一步的对象拷贝得到的,因此很容易占内存。在执行到Write() 或者 Render()之前,所显示的图像是不会更新的。每个类都会带有一个Update()可以强迫这个类的数据进行更新。由此可见vtk的整个流程并不是像flow一样,而是一层一层拷贝而来的。

    3. vtk代码例子

    官网例子

    import vtk
    
    def main():
        # 颜色类:包括了283种预设的颜色
        colors = vtk.vtkNamedColors()
        # 设置背景颜色
        bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
        colors.SetColor("BkgColor", *bkg)
    
        # 创建一个有八个面的多边形圆柱
        cylinder = vtk.vtkCylinderSource()
        cylinder.SetResolution(8)
    
        # mapper 将集合体放入图形库里
        # 也可以做颜色映射
        cylinderMapper = vtk.vtkPolyDataMapper()
        cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
        coneMapper = vtk.vtkPolyDataMapper()
        coneMapper.SetInputConnection(cone.GetOutputPort())
    
        # actor 的作用大概是把将几何体mapper,颜色和变换等组合在一起
        cylinderActor = vtk.vtkActor()
        cylinderActor.SetMapper(cylinderMapper)
        cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
        cylinderActor.RotateX(30.0)
        cylinderActor.RotateY(-45.0)
    
        # 创建并渲染图形结构
        # 渲染窗口会交互器捕捉鼠标事件
        ren = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren)
        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)
    
        # 将actors 加入渲染器, 并设置窗口的背景和大小
        ren.AddActor(cylinderActor)
        ren.AddActor(coneActor)
        ren.SetBackground(colors.GetColor3d("BkgColor"))
        renWin.SetSize(300, 300)
        renWin.SetWindowName('CylinderExample')
    
        #  interactor可以初始化自己,但必须在事件循环之前调用。
        iren.Initialize()
    
        # 缩放相机
        ren.ResetCamera()
        ren.GetActiveCamera().Zoom(1.5)
        renWin.Render()
         
        # 开始事件循环
        iren.Start()
    
    
    if __name__ == '__main__':
        main()
    
    圆柱体

    对物体进行360旋转,需要每秒对物体旋转一个角度并渲染出来:

    for i in range(0, 360):
            # Render the image.
            renWin.Render()
            # Rotate the active camera by one degree.
            ren.GetActiveCamera().Azimuth(1)
    

    想要同时展示两个物体并且分两个窗口,需要创建两个renderer并把对应的actor分配给他们,SetViewport必需的,不然会出现显示不出来的情况。

        ren1 = vtk.vtkRenderer()
        ren1.AddActor(coneActor)
        ren1.SetBackground(colors.GetColor3d('RoyalBlue'))
    
        ren1.SetViewport(0.0, 0.0, 0.5, 1.0)
    
        ren2 = vtk.vtkRenderer()
        ren2.AddActor(cylinderActor)
        ren2.SetBackground(colors.GetColor3d('DodgerBlue'))
        ren2.SetViewport(0.5, 0.0, 1.0, 1.0)
    
    显示两个

    也可以将多个actor与同一个render连接:

    ren1 = vtk.vtkRenderer()
        ren1.AddActor(coneActor)
        ren1.AddActor(coneActor2)
        ren1.SetBackground(colors.GetColor3d("CornflowerBlue"))
    

    参考
    https://kitware.github.io/vtk-examples/site/Python/

    相关文章

      网友评论

        本文标题:vtk学习笔记

        本文链接:https://www.haomeiwen.com/subject/ylymsltx.html