vtk例子中tutorial裏的實例源碼詳解

上一篇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裏面的後續幾個例子了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章