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是交互器,是用戶和三維場景交互的橋梁