VTK中的基本概念
1.三维场景中的基本要素
三维场景的基本要素包含:灯光、相机、颜色和纹理映射
(1)灯光vtkLight
光的本质是特定频段的电磁波,所以灯光的本质是特定频段(可见光频段)的电磁波发射器;依据发射可见光频段的方式不同,可以将灯光分为位置灯光和方向灯光
a) 位置灯光
- 概念:又名聚光灯,光源在场景的某个位置,可以指定光源的衰减值和锥角等特征,如音乐演唱会的聚光灯,将灯光聚焦在某一个具体的局部区域,并且颜色可以切换
- SetColor:设置聚光灯发射的可见光的颜色
- SetPosition:设置聚光灯光在场景中的位置
- SetFocalPoint:设置聚光灯的聚焦点,即指向场景中的哪个点
- SetIntensity:设置聚光灯的强度
- SetSwitch/SwitchOn/SwitchOff:设置聚光灯的开关
b) 方向灯光 - vtkDirectionalLight
- 概念:光源的位置在无穷远,光线可以看作是相互平行的,且没有衰减值,如太阳光;一般用于模拟全局光照
- SetPosition:方向灯光该函数设置的位置是象征性的,目的是配合SetFocalPoint确定光线的方向
- SetPositional(0):设置是否为位置光源,0表示方向光源
- SetFocalPoint:设置光照的焦点,配合SetPosition确定光照的方向
- SetDirection:设置光照的方向,优先级高于SetPosition和SetFocalPoint的计算结果
- GetDirection:获取光照的方向
- SetShadowAttenuation:设置阴影的衰减系数,用于控制阴影的明暗程度,注意:仅在启用阴影渲染时生效
(2)相机vtkCamera
a) 相机的作用
将三维场景投影到二维平面中,类似于生物的眼睛
b) 相机的属性
- SetPosition:相机在三维场景中的位置
- SetFocusPosition:相机的聚焦点
- SetViewUp:朝上方向,哪个方向为相机的朝上方向
- 投影方向:相机位置和相机焦点形成的向量方向即为相机的投影方向
- 投影方法:场景中的Actor是如何投影到相机的成像平面的,包括正交投影和透视投影
- 视角:视野范围,主要取决于焦距,焦距越大视野越小,即视角也越小,如CCD相机的焦距一般很长
- 前后裁剪平面:SetClippingRange,只有裁剪区间的场景物体才能被看到
(3)颜色vtkColor
颜色是物体的一种属性,在VTK中由vtkProperty所控制
(4)纹理映射
纹理映射的目的是吧渲染时把二维图像贴到三维物体的表面上,纹理映射的要素包含:待贴图表面、纹理坐标、纹理映射;后期会详细介绍纹理映射的具体细节,这里只需要理解它存在的本质就是为三维空间中的物体贴图而生的就好了
2.坐标系统和空间变换
(1)坐标系统
a) Model坐标系统
定义模型(如立方体)时候所采用的坐标系,它的本质是一个局部的笛卡尔坐标系
b) World坐标系统
防止模型对象的三维空间坐标系,它在VTK场景中是唯一的,用于确定各个对象在三维空间中的具体位置和角度
c) View坐标系统
相机内部的坐标系,用于将World坐标系转换为一个二维图像,三轴的取值为[-1.0,1.0]
d) Display坐标系统
显示屏的坐标系,单位是像素
(2)空间变换
a)线性变换
- 平移变换:改变物体在三维空间中的位置
- 旋转变换:改变物体在三维空间中的朝向,关键参数:旋转轴和旋转角度
- 缩放变换:改变物体在三维空间中的尺寸大小,包含均匀缩放和非均匀缩放,判断均匀缩放和非均匀缩放的标准是确定缩放后物体的XYZ缩放比例是否相同
- 剪切变换:类似于用一把巨大的刀切掉物体的一部分而保留剩下的部分,聚焦展示几何体的内部结构或特定区域,解决 "复杂几何体全貌显示时内部细节被遮挡" 的问题
b)非线性变换
VTK基础学习期间我们不做过多介绍,常见的有薄样条变换,模拟薄板受外力弯曲的效果,变形后保持平滑,无折角
c)透视变换
- vtkPerspectiveTransform,模拟相机透视投影的变换,将三维空间中的点映射到二维图像平面
- 透视变换的关键参数:相机内参和相机外参
3.VTK管线和渲染引擎
(1)VTK管线
a) 概念
本质是数据从产生到流向渲染引擎之前的流动和处理流程
vtk数据源 -> Filter -> Mapper
b) 链接
可视化管线使用SetInputConnection和GetOutputPort函数进行链接,要求两部分的数据类型必须一致
c) 执行
遵循惰性赋值的原则:类似于Make编译机制,只有源文件修改时间大于编译时间,才会进行重新编译
(2)渲染引擎
a) 作用
将管线输出的数据进行可视化表达(即通过显示屏呈现给用户)
b) 概念
在VTK中渲染引擎包括:vtkActor(vtkVolumn)、vtkRender(vtkLight、vtkCamera)、vtkRenderWindow、vtkInteractor等
- vtkActor接收来自vtk管线的模型数据,并将数据转为可可视化表达的图元数据
- vtkRender是可视化的场景,向场景中添加模型对象,配合灯光和相机等模拟一个三维场景
- vtkRenderWindow是可视化场景的窗口,用于向用户呈现vtkRender场景对象
- vtkInteractor是交互器,是用户和三维场景交互的桥梁