cmake 下載安裝
下載VTK
打開cmake,將source code
處定位到VTK包解壓目錄中,含有CMakeList.txt文件的父目錄下。我的如下,除了放置位置的路徑不同,後面大家應該是一樣的。
在Cmake的where to build the binaries
處,先填寫一個還不存在的文件夾的目錄,如在VTK存放目錄對應下,寫一個新文件夾名字 vtk_file
。
source code
和binaries
都定位和寫好後,點擊configure
; 此時CMake 會跳出來詢問:vtk_file
是一個不存在的文件夾,是否應該新建? 點擊是後,Cmake會讓你選擇speficy the generator for the project
, 選擇一個與自己windows安裝的VS版本一致的選項,注意!,一定要選擇與自己VS版本一致的選擇完成後,點擊finish退出
點擊configure
,等待,第一次configure結束後,會顯示一堆背景爲紅色的信息。 這時在vtk_file目錄下新建一個文件夾,位置也可以自定義,文件夾名稱爲vtk_prefix
Attention !!!:
將cmake目錄下的CMAKE_INSTALL_PREFIX
後面的目錄,改爲自己定義的文件夾的目錄,如我的如上圖;
VTK下面的vtk_use_cuda, vtk_use_large_data等都不要勾選,因爲我們並沒有下載這些包,所以點擊安裝就會報錯。
修改好後,再次點擊configure
,結束後,點擊generate
generate 結束後,點擊其旁邊的Open Project,(如果你不小心關閉了cmake,也可以進入自己定義的bineries對應的文件夾中找到VTK.sln打開,是一樣的) 你的VS 就會被調用打開,進入下一步。
打開後,選擇該文件右鍵-生成,然後需等待小10分鐘
第一步完成後,往下翻,找到INSTALL
,右鍵,生成,這個稍微快點
install完成後就可以關閉該sln文件了。到自己定義的vtk_prefix文件裏應該就可以找到以下幾個文件夾了。那麼說明,又一步驟完成了。接下來是在VS裏配置環境等。
新建一個項目,然後在右側項目名右鍵—屬性後打開屬性頁面
在[項目->屬性->配置屬性->VC++目錄->包含目錄] 裏添加vtk_prefix 文件下的include文件夾下的vtk-9.0目錄,注意,不是直接添加include目錄,一定是定位到有一堆子文件下後的那個目錄。
在[項目->屬性->配置屬性->鏈接器 附加庫目錄] 裏添加vtk_prefix的lib文件夾。
在vtk_prefix的lib文件夾內新建一個txt文件,將如下內容複製到txt文件後保存,改後綴.txt爲.bat並運行。然後會生成了一個新的LIBLIST.txt文件,文件存有所有lib文件的名字。
DIR *.lib /B >LIBLIST.TXT
[項目->屬性->配置屬性->鏈接器->輸入 附加依賴項] ,將上面生成的所有lib文件的名字粘貼進去。
在[項目->屬性->配置屬性->調試 環境] 寫入PATH=(vtk_prefix下的bin文件夾目錄)
,
這樣.h,lib,dll文件都配置好了,可以寫代碼了
在項目裏新建一個cpp文件,在複製進測試文件時,需要先將以下代碼寫入,而且每次寫vtk文件都需要複製以下代碼,具體其他解決辦法還沒發現
#include <vtkAutoInit.h>
VTK_MODULE_INIT ( vtkRenderingOpenGL2) ;
VTK_MODULE_INIT ( vtkInteractionStyle) ;
複製以下測試代碼,運行
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
#include "vtkBoxWidget.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"
class vtkMyCallback : public vtkCommand
{
public :
static vtkMyCallback* New ( )
{
return new vtkMyCallback;
}
void Execute ( vtkObject* caller, unsigned long , void * ) VTK_OVERRIDE
{
vtkTransform* t = vtkTransform:: New ( ) ;
vtkBoxWidget* widget = reinterpret_cast < vtkBoxWidget* > ( caller) ;
widget- > GetTransform ( t) ;
widget- > GetProp3D ( ) - > SetUserTransform ( t) ;
t- > Delete ( ) ;
}
} ;
int main ( )
{
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 ) ;
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor:: New ( ) ;
iren- > SetRenderWindow ( renWin) ;
vtkInteractorStyleTrackballCamera* style =
vtkInteractorStyleTrackballCamera:: New ( ) ;
iren- > SetInteractorStyle ( style) ;
vtkBoxWidget* boxWidget = vtkBoxWidget:: New ( ) ;
boxWidget- > SetInteractor ( iren) ;
boxWidget- > SetPlaceFactor ( 1.25 ) ;
boxWidget- > SetProp3D ( coneActor) ;
boxWidget- > PlaceWidget ( ) ;
vtkMyCallback* callback = vtkMyCallback:: New ( ) ;
boxWidget- > AddObserver ( vtkCommand:: InteractionEvent, callback) ;
boxWidget- > On ( ) ;
iren- > Initialize ( ) ;
iren- > Start ( ) ;
cone- > Delete ( ) ;
coneMapper- > Delete ( ) ;
coneActor- > Delete ( ) ;
callback- > Delete ( ) ;
boxWidget- > Delete ( ) ;
ren1- > Delete ( ) ;
renWin- > Delete ( ) ;
iren- > Delete ( ) ;
style- > Delete ( ) ;
return 0 ;
}