#!/usr/bin/env python

import vtk


def main ():
    colors = vtk.vtkNamedColors()
    # 设置背景颜色
    bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
    # bkg要是一个可迭代的对象
    colors.SetColor("BkgColor", *bkg)

    # 创建了一个有八个圆周切面的多边形圆柱模型,以原点为中心。cylinder圆柱
    cylinder = vtk.vtkCylinderSource()
    cylinder.SetResolution(6)

    # 映射器(mapper)负责将几何图形推入图形库。
    # vtkPolyDataMapper是一个将多边形数据映射到图形原语的类。
    # vtkPolyDataMapper是设备特定的poly数据映射器的超类,
    # 它实际执行到呈现/图形硬件/软件的映射。
    # 如果定义了标量或其他属性,它还可以进行颜色映射。

    cylinderMapper = vtk.vtkPolyDataMapper()
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    # actor是一种分组机制:除了几何(mapper)之外,它还有一个属性、转换矩阵和/或纹理映射
    # 这里我们设置它的颜色并旋转它-22.5度

    cylinderActor = vtk.vtkActor()
    cylinderActor.SetMapper(cylinderMapper)

    # 设置/获取控制这个角色表面的属性对象属性。GetColor3d:通过名字得到颜色
    cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))

    '''旋转,绕坐标轴旋转'''
    # cylinderActor.RotateX(90.0)
    # cylinderActor.RotateY(-45.0)
    # cylinderActor.RotateZ(90.0)

    # cylinderActor.SetPosition(2, 1, 3) 设置位置

    # 围绕后三个参数指定的任意轴旋转Prop3D。轴是在世界坐标中指定的.
    cylinderActor.RotateWXYZ(90, 0, 0, 1)  # 以(0,0,1)为轴顺时针旋转90度
    # 在xyz轴上增量(位移)
    cylinderActor.AddPosition(0, 0, 1)

    # 创建图形结构。渲染器渲染到渲染窗口。
    # 渲染窗口交互器捕获鼠标事件,并根据事件的性质执行适当的相机或角色操作。
    # vtkRenderer为渲染器提供了一个抽象的规范。
    # 渲染器是一个对象,它控制对象的渲染过程。
    # 渲染是将几何图形、灯光规范和摄像机视图转换为图像的过程。
    # vtkRenderer还执行世界坐标、视图坐标(计算机图形绘制坐标系统)
    # 和显示坐标(显示设备上的实际屏幕坐标)之间的坐标转换。
    # 某些高级渲染功能,如双面照明也可以控制

    ren = vtk.vtkRenderer()
    renWin = vtk.vtkRenderWindow()
    # 将一个渲染器添加到渲染器列表中。
    renWin.AddRenderer(ren)
    # vtkRenderWindowInteractor用于获取渲染窗口上发生的鼠标,键盘,事件事件。
    iren = vtk.vtkRenderWindowInteractor()
    # SetRenderWindow设置 / 获取由该对象控制的呈现窗口。
    iren.SetRenderWindow(renWin)

    # 在渲染窗口中创建坐标轴
    axes = vtk.vtkAxesActor()
    axes.SetTotalLength(1, 1, 1)
    axes.SetShaftType(0)
    axes.SetAxisLabels(0)
    axes.SetCylinderRadius(0.02)
    ren.AddActor(axes)

    # 添加actor到渲染器,设置背景和大小

    # 添加 / 删除渲染器中不同类型的道具
    ren.AddActor(cylinderActor)
    ren.SetBackground(colors.GetColor3d("BkgColor"))
    renWin.SetSize(600, 600)
    renWin.SetWindowName('Cylinder')

    # 这允许交互器初始化自己。准备处理事件并将启用标志设置为true。
    # 必须在事件循环之前声明调用。
    iren.Initialize()

    # 我们将通过访问相机并在其上调用一个“zoom”方法来放大一点。
    # 自动根据可视化actors设置相机
    ren.ResetCamera()
    # 使用当前的相机。Zoom初始图形大小
    ren.GetActiveCamera().Zoom(0.5)
    # 请求这个renderer窗口拥有的每个渲染器渲染它的图像并同步这个进程。
    renWin.Render()

    # 启动事件循环。
    iren.Start()


if __name__ == '__main__':
    main()

VTK工作原理参考:

框架参考:

vtk的Python函数库 vtk python_vtk的Python函数库