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
13graph 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
5light = vtk.vtkLight()
light.SetColor(1, 0, 0)
light.SetFocalPoint(cam1.GetFocalPoint())
light.SetPosition(cam1.GetPosition())
ren1.AddLight(light) - 定点光源Positional Lights【需要进一步理解】
使用PositionalOn()可以创建一个定点光源,可以和SetConeAngle()一起使用来控制聚光的面积,如果是180度的锥角的话,表明没有聚光效果而只有位置效果。