導讀:前面我們使用了pyvista來進行VTK程式設計。這個話題是直接從VTK本身出發。
第一講,講VTK的基本操作流程。
1、一個故事
2、我們需要一個演員
3、為演員準備情節
4、為演員準備形象
5、成為一個演員
6、為演員化妝
7、搭建一個舞臺
8、為舞臺建一個劇場
9、為劇場增加設施
10、將演員放進去
11、準備劇場裝置
12、調整相機
13、演員就位
14、開始演出
VTK的世界,正如我們的人生,每一個數據都是一個演員。
最近我讀了一本書,名字叫《故事力》,書中說明了一個故事產生的力有多大。我們使用VTK這個視覺化工具,本質上也是在為故事增加色彩。
試想一下,一個啞劇,或者我們聽評書,從表現力來說,是不是缺少了什麼。
我們完全可以用資料來展示給我們要展示的人,告訴他們你的牙齒的骨質減少了多少。但是這可能不能給我們直接的感受。
在資料裡,視覺化,可以說是我們的眼睛,為我們帶來了色彩,更重要的,為我們打通了我們幾百萬年的因為視覺給我們的大腦的處理能力。
1、一個故事
我喜歡爬山,在出發之前,我都會看一下地圖,不是交通圖,而是地形圖。
我想知道那些河流為什麼如此蜿蜒?
我想知道那些高山為什麼如此挺拔?
我想知道地殼背後的故事。
我想知道歐亞板塊為什麼可以擠壓出 喜馬拉雅?
這些都是我想在地形圖中看到的故事。
比如,我想知道一個地圖,哪些地方高,哪些地方低,是不是隻有資料就可以了?
顯然是不夠的,因為,知道高低不是目的,目的是為了一次旅行,或者,為了尋找水源。
所以,資料化處理的目的,就是給使用者一個舞臺,一個展現他故事想象力的舞臺和舞臺中的配角。
而VTK就是打造這個舞臺的工具,使用VTK可以打造這個舞臺,豐富這個舞臺上的配角。
使用者是這個舞臺的主角。
而,我們,是這個舞臺的建造者。
2、我們需要一個演員
一個演員,是一個劇情所需要的角色的扮演者。他具有這個角色所需要的各方面的元素。對於資料視覺化來說,一個數據演員,就是那個資料的扮演者。這個演員需要內涵,也就是資料。也需要形象,就是圖形的形象,更需要一些動作。
在VTK中所有的Source都是資料。資料的形象是Mapper,而actor是演員。
最終在一個舞臺上呈現,舞臺,是render。
這樣就構成了一個基本要素。
我們得先為render這個舞臺準備演員也就是actor,然後把actor放置在render這個舞臺上。
3、為演員準備情節(Source)
我們這個資料是一堆數字,記錄了一個圓柱體的幾何資訊。
cylinder = vtk.vtkCylinderSource()
4、為演員準備形象(Mapper)
我們把資料對映成一個圖形,或者對映成一個可以直接被舞臺轉化為圖形的東西。這個就是Mapper。我們需要建立這個Mapper和資料之間的連線。
cylinderMapper = vtk.vtkPolyDataMapper()cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
5、成為一個演員
有了資料,有了資料形成的影象,我們就可以建立一個演員了。
cylinderActor = vtk.vtkActor() cylinderActor.SetMapper(cylinderMapper)
同樣,我們需要建立,這個演員和形象也就是Mapper之間的連線。
6、為演員化妝
只有資料,並且對映成圖形,這可能還不夠,我們還需要為這個演員化妝。做形象設計。這就是顏色的作用。
cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
7、搭建一個舞臺
建立render,並給這個舞臺一個背景
ren = vtk.vtkRenderer() colors = vtk.vtkNamedColors() # Set the background color. bkg = map(lambda x: x / 255.0, [26, 51, 102, 255]) colors.SetColor("BkgColor", *bkg)ren.SetBackground(colors.GetColor3d("BkgColor"))
8、為舞臺建一個劇場
劇場大小,劇場的名字
renWin = vtk.vtkRenderWindow()renWin.AddRenderer(ren)renWin.SetSize(300, 300)renWin.SetWindowName('VTK大劇場')
9、為劇場增加設施(互動)
iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin)
10、將演員放進去
ren.AddActor(cylinderActor)
11、準備劇場裝置
iren.Initialize()
12、調整相機
ren.ResetCamera()ren.GetActiveCamera().Zoom(1.5)renWin.Render()# Start the event loop.iren.Start()
13、演員就位
renWin.Render()
14、開始演出
# Start the event loop.iren.Start()
15、結束
所以,每一個VTK的視覺化處理,都是一個故事的開始。我們得親自為每一場演出,完成每一個角色,每一個場景,每一個劇場。