在VTK的編譯與安裝一文中介紹了VTK的編譯和安裝過程,本文則繼續探索在Qt中使用開源三維引擎VTK,在VTK安裝完成後,會有以下文件夾
其中dll文件放在bin目錄下,include存放.h文件,lib中存放lib庫文件,plugins文件夾下保存了生成的Qt設計師工具的插件,在VTK的早期版本一直是使用designer插件實現在Qt中顯示VTK窗口的,但是在VTK8.0以後則可以直接使用Qt自帶的QOpenGLWidget控制項顯示VTK窗口,但插件方式暫時還支持,本文使用後者實現VTK窗口的顯示。
可以使用Qt creator或者VS創建Qt工程(前提是VS安裝了Qt addin插件),創建一個Qt widget application, 創建完成後會自動產生如下文件:
使用CMake可以比較方便的項目的配置,比如項目的依賴文件。首先創建CMakeLists.txt文件,在項目中使用VTK庫,需要添加一下兩行CMake代碼
find_package( VTK REQUIRED ) include( ${VTK_USE_FILE} )在CMakeLists.txt文件編輯完成後,使用CMake創建VS項目,然後使用VS打開項目:
//定義renderer、connect以及render window對象vtkSmartPointer<vtkRenderer> mRenderer;vtkSmartPointer<vtkEventQtSlotConnect> mSlotConnect;vtkSmartPointer<vtkGenericOpenGLRenderWindow> mRenderWindow;
//創建對象mRenderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();mRenderer = vtkSmartPointer<vtkRenderer>::New();mSlotConnect = vtkSmartPointer<vtkEventQtSlotConnect>::New();
//關聯到剛剛添加的opengl widgetui->openGLWidget->SetRenderWindow(mRenderWindow);ui->openGLWidget->GetRenderWindow()->AddRenderer(mRenderer);mSlotConnect->Connect(ui->openGLWidget->GetRenderWindow()->GetInteractor(), vtkCommand::MouseMoveEvent, this, SLOT(updateCoordsSlot(vtkObject *)));mRenderer->GradientBackgroundOn();mRenderer->SetBackground(0.0, 0.098, 0.188);//定義坐標系部件vtkSmartPointer<vtkOrientationMarkerWidget> mAxesWidget;vtkSmartPointer<vtkAxesActor> mAxesActor;
//給render添加坐標系部件mAxesWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();auto rwi = mRenderer ? mRenderer->GetRenderWindow()->GetInteractor() : nullptr;mAxesWidget->SetDefaultRenderer(mRenderer);mAxesWidget->SetInteractor(rwi);mAxesActor = vtkSmartPointer<vtkAxesActor>::New();mAxesWidget->SetOrientationMarker(mAxesActor);mAxesWidget->SetViewport(0.0, 0.0, 0.2, 0.16);mAxesWidget->SetEnabled(1);mAxesWidget->InteractiveOn();vtkSmartPointer<vtkPlaneSource> mReferencePlaneSource;vtkSmartPointer<vtkPolyDataMapper> mReferencePlaneMapper;vtkSmartPointer<vtkActor> mReferencePlaneActor;
mReferencePlaneSource = vtkSmartPointer<vtkPlaneSource>::New();mReferencePlaneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();mReferencePlaneActor = vtkSmartPointer<vtkActor>::New();mReferencePlaneSource->SetXResolution(20);mReferencePlaneSource->SetYResolution(20);mReferencePlaneSource->SetOrigin(-1000.0, -1000.0, 0.0);mReferencePlaneSource->SetPoint1(1000.0, -1000.0, 0.0);mReferencePlaneSource->SetPoint2(-1000.0, 1000.0, 0.0);mReferencePlaneMapper->SetInputConnection(mReferencePlaneSource->GetOutputPort());mReferencePlaneActor->SetMapper(mReferencePlaneMapper);mReferencePlaneActor->GetProperty()->SetRepresentationToWireframe();mReferencePlaneActor->GetProperty()->SetColor(0.5, 1.0, 1.0);mReferencePlaneActor->SetVisibility(true);mRenderer->AddActor(mReferencePlaneActor);camera->SetPosition(-1200.0, -1200.0, 1200.0); camera->SetFocalPoint(0.0, 0.0, 0.0); camera->SetViewUp(0.0, 0.0, 1.0); camera->ComputeViewPlaneNormal(); if (mRenderer) { mRenderer->SetActiveCamera(camera); mRenderer->ResetCamera(); }