talk is cheap, show me the code。
下面是官方example中的第一個,也是最簡單一個,我把英文註釋刪除了,按照自己的理解加了中文註釋。
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 ); //準備需要渲染的數據
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); //創建映射器
coneMapper->SetInputConnection( cone->GetOutputPort() ); //將準備的數據連接到映射器
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper ); //創建一個演員來代表數據
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor ); //創建一個渲染器添加演員
ren1->SetBackground( 0.1, 0.2, 0.4 ); //設置背景色
// 創建渲染窗口來顯示數據
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 ); //設置渲染窗口的大小
// 接下來將actor逐漸旋轉,每次旋轉1°
int i;
for (i = 0; i < 360; ++i)
{
renWin->Render();
// 每次旋轉1°
ren1->GetActiveCamera()->Azimuth( 1 );
}
按照pipeline的思維導圖,連接如下:
假如說,我們需要在窗口中渲染兩個cone怎麼辦呢?
首先,肯定需要兩個vtkConeSource,也需要兩個vtkActor,同樣也需要兩個vtkPolyDataMapper,那麼來做一個實驗,在example上新增上述三個類,注意爲了避免兩個圖形重合,需要進行些許修改,代碼如下:
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );
cone->SetCenter(-2.0,-0.0,-0.0); //修改了圖形的原點
vtkConeSource *cone1 = vtkConeSource::New();
cone1->SetHeight(3.0);
cone1->SetRadius(1.0);
cone1->SetResolution(10);
cone1->SetCenter(0.0,0.0,0.0); //圖形原點
同樣的,再新增以下代碼:
vtkPolyDataMapper *coneMapper1 = vtkPolyDataMapper::New();
coneMapper1->SetInputConnection(cone1->GetOutputPort());
vtkActor *coneActor1 = vtkActor::New();
coneActor1->SetMapper(coneMapper1);
ren1->AddActor(coneActor1);
最終得到的結果如下圖所示:
好了,理解了cone的渲染就知道了vtk的編程模型了。
如果沒有完全理解,可以再把cone開頭的幾個example再消化一下。