文章目錄
- 1. 概述
- 2. CMake鏈接VTK
- 3. main.cpp文件
- 4. 演示效果
更多精彩內容 |
---|
👉內容導航 👈 |
👉VTK開發 👈 |
1. 概述
與上一個示例不同的是,使用
vtkImageReader2Factory
根據文件擴展名或內容自動創建對應的圖像文件讀取器,讀取不同后綴的圖片。功能總結:
圖像加載:
- 使用 vtkImageReader2Factory 根據文件擴展名或內容自動創建合適的圖像讀取器。
- 加載指定路徑的圖像文件(如
code.png
或wintersun.jpg
)。紋理設置:
- 將加載的圖像設置為紋理,并啟用插值以使紋理更加平滑。
平面創建:
- 創建一個平面幾何體,并設置其中心和法向量。
紋理映射:
- 使用 vtkPolyDataMapper 將平面幾何體映射到渲染管線。
- 將紋理應用到平面上。
渲染設置:
- 創建一個渲染器 (vtkRenderer),將平面(帶紋理)添加為演員 (vtkActor)。
- 設置背景顏色為
SlateGray
。窗口與交互:
- 創建渲染窗口 (vtkRenderWindow) 并設置大小。
- 創建渲染窗口交互器 (vtkRenderWindowInteractor),允許用戶與渲染窗口交互。
渲染與交互啟動:
- 調用
Render()
方法進行渲染。- 調用
Start()
方法啟動交互。演示文件下載地址
環境 | 說明 |
---|---|
系統 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
編譯器 | g++11.4、msvc2017 |
VTK | 9.4.1 |
2. CMake鏈接VTK
cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 設置CMake最低版本
project(vtk2) # 設置項目名稱
# 查找VTK庫
find_package(VTK COMPONENTS
CommonColor
CommonCore
FiltersSources
IOImage
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()add_executable(vtk2 main.cpp) # 添加可執行文件target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 鏈接VTK庫
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模塊
3. main.cpp文件
/********************************************************************************
* 文件名: main.cpp
* 創建時間: 2025-03-22 20:31:57
* 開發者: MHF
* 郵箱: 1603291350@qq.com
* 功能:
*********************************************************************************/
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkImageReader2.h>
#include <vtkImageReader2Factory.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlaneSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTexture.h>using namespace std;int main()
{string fileName = "e:/lib/VTK/vtk-data/Data/code.png";// string fileName = "e:/lib/VTK/vtk-data/Data/wintersun.jpg";vtkNew<vtkImageReader2Factory> readerFactory; // 根據文件擴展名或內容自動創建對應的圖像文件讀取器vtkSmartPointer<vtkImageReader2> textureFile; // 紋理文件讀取器textureFile = readerFactory->CreateImageReader2(fileName.c_str());textureFile->SetFileName(fileName.c_str());textureFile->Update();vtkNew<vtkTexture> texture; // 紋理texture->SetInputConnection(textureFile->GetOutputPort());texture->InterpolateOn(); // 紋理插值,使紋理更加平滑vtkNew<vtkPlaneSource> plane; // 平面plane->SetCenter(0.0, 0.0, 0.0);plane->SetNormal(0.0, 0.0, 1.0); // 平面法向量vtkNew<vtkPolyDataMapper> mapper; // 映射器mapper->SetInputConnection(plane->GetOutputPort());vtkNew<vtkActor> actor; // 演員actor->SetMapper(mapper); // 設置映射器actor->SetTexture(texture); // 設置紋理vtkNew<vtkNamedColors> colors; // 顏色vtkNew<vtkRenderer> renderer; // 渲染器renderer->AddActor(actor); // 添加演員renderer->SetBackground(colors->GetColor3d("SlateGray").GetData()); // 設置背景顏色vtkNew<vtkRenderWindow> renderWindow; // 渲染窗口renderWindow->AddRenderer(renderer); // 添加渲染器renderWindow->SetSize(600, 600); // 設置窗口大小vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; // 渲染窗口交互器renderWindowInteractor->SetRenderWindow(renderWindow); // 設置渲染窗口renderWindow->Render(); // 渲染renderWindowInteractor->Start(); // 開始交互return 0;
}