上一篇blog講解了cmake編譯或者自己添加工程的include,lib的方法,因此對源代碼進行進一步的說明,從而有利於更好的理解vtk和cmake編程。
cmake代碼詳解:
打開tutorial裏step文件夾的CMakeLists.txt文件,該文件定義了整個工程基本信息。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PROJECT (Step1) //定義工程名爲 Step1
IF(NOT VTK_BINARY_DIR) //尋找是否已經定義 VTK_BINARY_DIR變量
/* 一般情況下,這個值得是vtk dll文件的路徑*/
FIND_PACKAGE(VTK REQUIRED) //通過這行命令,找到vtk需要的文件,庫等的路徑
IF(NOT VTK_USE_RENDERING) //如果沒有定義VTK_USE_RENDERING就輸出如下的錯誤信息
MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.")
ENDIF(NOT VTK_USE_RENDERING)
INCLUDE(${VTK_USE_FILE}) //添加include文件,整個變量路徑爲 VTK_USE_FILE
ENDIF(NOT VTK_BINARY_DIR)
ADD_EXECUTABLE(Cone Cone.cxx) //添加Cone.cxx文件,編譯生成Cone.exe運行文件
TARGET_LINK_LIBRARIES(Cone vtkRendering) //添加工程需要依賴的 vtkRendering
下面來查看一下這些變量,通過Message輸出顯示:
修改源代碼如下:
cmake_minimum_required(VERSION 2.8) //添加cmake版本要求,否則會出現warning
PROJECT (Step1)
IF(NOT VTK_BINARY_DIR)
Message("vtk binary dir: ${VTK_BINARY_DIR}")
FIND_PACKAGE(VTK REQUIRED)
IF(NOT VTK_USE_RENDERING)
MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.")
ENDIF(NOT VTK_USE_RENDERING)
INCLUDE(${VTK_USE_FILE})
Message("vtk use file: ${VTK_USE_FILE}")
ENDIF(NOT VTK_BINARY_DIR)
ADD_EXECUTABLE(Cone Cone.cxx)
TARGET_LINK_LIBRARIES(Cone vtkRendering)
輸出顯示爲:
vtk binary dir:
vtk use file: C:/Program Files/VTK/lib/vtk-5.10/UseVTK.cmake
由此可見:
VTK_BINARY_DIR 爲 NULL
VTK_USE_FILE 爲 C:/Program Files/VTK/lib/vtk-5.10/UseVTK.cmake
整個工程師通過UseVTK.cmake找到vtk的目錄
程序源碼詳解:
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
int main()
{
//構建cone source 數據模型
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );
//將模型添加到mapper中,從而可以顯示
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection( cone->GetOutputPort() );
//將mapper添加到 actor中,這裏還可以設置模型顯示的其他屬性
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper );
//render用來管理繪製場景的,可以定義其在window中佔比和位置等
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor );
ren1->SetBackground( 0.1, 0.2, 0.4 );
//顯示的窗口,主要管理render的繪製
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 );
//通過修改camera,從而能夠看到window中的模型旋轉一週,否則會一閃而過
int i;
for (i = 0; i < 360; ++i)
{
// render the image
renWin->Render();
// rotate the active camera by one degree
ren1->GetActiveCamera()->Azimuth( 1 );
}
/* vtk中的類都是通過工廠模式創建的,其開闢的空間都需要Delete函數釋放,當然,可以通過智能指針統一管理,vtkSmartPoints */
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete();
return 0;
}
好了,現在大家可以按照同樣的方式,練習和學習tutorial裏面的後續幾個例子了。