VTK③基础功能之上

基础功能里面有太多需要理解的东西了,最基础的已经在前面学习了,今天还是稍微深入一点的话题,比如3D,纹理贴图这样的

控制3D 道具

前面已经理解过了,渲染可以当做一个舞台,那么在舞台上显示的东西当然就是道具了。所以,所有在VTK渲染窗口显示的都可以称之为道具。事实上VTK定义了各种类型的道具, 比如vtkProp3D和vtkActor。vtkProp3D是3D空间那些道具的抽象超类,而vtkActor是vtkProp3D的具体实现,只是这个具体实现的几何形状是由多边形、线条灯解析基元来定义的。VTK文档的类参考文档中可以看到这个继承关系。

  • 定义vtkProp3D的位置
    前面我们学习了而让相机围绕一个物体移动,相应的我们也可以让相机保持静止,让物体移动。下面这些方法就是用来定义vtkProp3D及其子类的位置:

    方法名称 方法描述
    SetPosition(x, y, z) 在世界坐标系中指定vtkProp3D物体的具体位置
    AddPosition(deltaX, deltaY, deltaZ) 在X, Y, Z轴方向,根据指定的变化量deltaX-Y-Z移动vtkProp3D
    RotateX(theta), RotateY(theta), RotateZ(theta) 分别围绕坐标轴X,Y,Z旋转【theta】度
    SetOrientation(x, y, z) 根据参数来参照世界坐标系的X,Y,Z轴设置道具的方向
    AddOrientation(a1, a2, a3) 增加道具当前的方向
    RotateWXYZ(theta, x, y, z) 围绕以x-y-z定义的轴,旋转【theta】度
    SetScale(sx, sy, sz) 在X,Y,Z轴方向上缩放
    SetOrigin(x, y, z) 指定道具的原点,旋转和缩放都以这个为基准点
    上面这些方法可以整合在一起,以实现复杂的位置转化,在数学上就是一个结果转化矩阵。这里需要强调的是,上面这些方法的组合的顺序会严重影响最终道具的位置。在VTK中,位置转换的顺序是这样的:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    graph LR 
    subgraph SHIFT
    A(Shift to Origin)
    F(Shift from Origin)
    end
    subgraph ROTATE
    C(Y) --> D(X)
    D --> E(Z)
    end
    A --> B(Scale)
    B --> C
    E --> F
    F --> G(Translate)

    这里要注意的是Shift To(向原点)和Shift From(从原点),分别是对原点值的负平移和正平移,最终净平移由vtkProp3D的位置值给出。在这里需要注意旋转,因为先执行X旋转再执行Y旋转和倒叙操作的结果是完全不一样的。

  • 角色Actors
    Actor是最普遍使用的一种vtkProp3D。和其他子类一样,vtkActor用于分组渲染属性,如表面属性(如环境色、漫反射色和高光色)、表示(如表面或线框)、纹理映射和/或几何定义(映射器)。

Picking

vtkLight

灯光比相机容易控制,最常用的方法就是SetPosition(), SetFocalPoint()SetColor();另外,相机的灯光可以用SwitchOn()SitchOff()开关;用SetIntensity()来控制强度

  • 默认的vtkLight实例是定向灯光,也就是说其位置(position)和焦点(focal point)定义了一个平行于光线行进方向的矢量,并且光源假定在无穷远处。这意味着如果位置和焦点被同样地改变的话,物体上的光照不变。
    通常,我们用如下的定义灯光,比如红色的头灯,位于相机的位置,指向相机的焦点。
    1
    2
    3
    4
    5
    light = vtk.vtkLight()
    light.SetColor(1, 0, 0)
    light.SetFocalPoint(cam1.GetFocalPoint())
    light.SetPosition(cam1.GetPosition())
    ren1.AddLight(light)
  • 定点光源Positional Lights【需要进一步理解】
    使用PositionalOn()可以创建一个定点光源,可以和SetConeAngle()一起使用来控制聚光的面积,如果是180度的锥角的话,表明没有聚光效果而只有位置效果。