文章目錄
- 1. 概述
- 2. CMake鏈接VTK
- 3. main.cpp文件
- 4. 演示效果
更多精彩內容 |
---|
👉內容導航 👈 |
👉VTK開發 👈 |
1. 概述
將圖片紋理貼到球體上,實現3D地球的效果。
該代碼使用了 VTK (Visualization Toolkit) 庫來創建一個紋理化的球體,并將其渲染到窗口中。以下是代碼的主要功能概述:
- 加載紋理圖像:
- 通過 vtkImageReader2Factory 和 vtkImageReader2 加載指定路徑的紋理圖像文件(如
earthmap2k.jpg
)。- 將圖像數據傳遞給 vtkTexture 對象,用于生成紋理。
- 創建球體幾何體:
- 使用 vtkTexturedSphereSource 創建一個球體幾何體。
- 設置球體的緯度和經度分辨率(
SetPhiResolution
和SetThetaResolution
)。- 紋理映射:
- 使用 vtkTransformTextureCoords 對球體的紋理坐標進行變換(目前未啟用平移功能)。
- 將紋理映射到球體表面。
- 渲染設置:
- 創建 vtkPolyDataMapper 將幾何體數據映射為圖形數據。
- 創建 vtkActor,將紋理和幾何體綁定到一起。
- 創建 vtkRenderer,將演員(
Actor
)添加到渲染器中,并設置背景顏色為黑色。- 窗口和交互:
- 創建 vtkRenderWindow,用于顯示渲染結果。
- 創建 vtkRenderWindowInteractor,允許用戶與渲染窗口進行交互。
- 設置窗口大小為 600x600,并命名為 “TexturedSphere”。
- 渲染與交互:
- 調用
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
FiltersTexture
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 22:05:38
* 開發者: MHF
* 郵箱: 1603291350@qq.com
* 功能:
*********************************************************************************/
#include<iostream>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkImageReader.h>
#include <vtkImageReader2Factory.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkTexture.h>
#include <vtkTextureMapToSphere.h>
#include <vtkTexturedSphereSource.h>
#include <vtkTransformTextureCoords.h>
using namespace std;int main()
{// string fileName = "e:/lib/VTK/vtk-data/Data/earth.ppm";string fileName = "e:/lib/VTK/vtk-data/Data/earthmap2k.jpg";// string fileName = "e:/lib/VTK/vtk-data/Data/mercurymap.jpg";vtkNew<vtkTexturedSphereSource> sphere; //創建一個球體sphere->SetPhiResolution(100); //設置球體的緯度分辨率sphere->SetThetaResolution(100); //設置球體的經度分辨率vtkNew<vtkImageReader2Factory> readerFactory; //創建一個圖像讀取器工廠vtkSmartPointer<vtkImageReader2> reader; //創建一個圖像讀取器reader = readerFactory->CreateImageReader2(fileName.c_str()); //創建一個圖像讀取器reader->SetFileName(fileName.c_str()); //設置圖像文件名vtkNew<vtkTexture> texture; //創建一個紋理texture->SetInputConnection(reader->GetOutputPort()); //設置紋理的輸入連接texture->InterpolateOn(); //開啟紋理插值vtkNew<vtkTransformTextureCoords> transformTexture; //創建一個紋理坐標變換器transformTexture->SetInputConnection(sphere->GetOutputPort()); //設置輸入連接
#if 0// 設置紋理坐標在 U/V/W 三個方向上的平移量double translate[3] = {0, 0, 0.0};transformTexture->SetPosition(translate); //設置位置
#endifvtkNew<vtkPolyDataMapper> mapper; //創建一個多邊形數據映射器mapper->SetInputConnection(transformTexture->GetOutputPort()); //設置輸入連接vtkNew<vtkActor> actor; //創建一個演員actor->SetMapper(mapper); //設置映射器actor->SetTexture(texture); //設置紋理vtkNew<vtkNamedColors> colors; //創建一個顏色vtkNew<vtkRenderer> renderer; //創建一個渲染器renderer->AddActor(actor); //添加演員renderer->SetBackground(colors->GetColor3d("Black").GetData()); //設置背景顏色vtkNew<vtkRenderWindow> renderWindow; //創建一個渲染窗口renderWindow->AddRenderer(renderer); //添加渲染器renderWindow->SetWindowName("TexturedSphere"); //設置窗口名稱renderWindow->SetSize(600, 600);vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; //創建一個渲染窗口交互器renderWindowInteractor->SetRenderWindow(renderWindow); //設置渲染窗口renderWindow->Render(); //渲染renderWindowInteractor->Start(); //開始交互return 0;
}