文章目录
-
- [1. 概述](#1. 概述)
- [2. CMake链接VTK](#2. CMake链接VTK)
- [3. main.cpp文件](#3. main.cpp文件)
- [4. 演示效果](#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
shell
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文件
cpp
/********************************************************************************
* 文件名: main.cpp
* 创建时间: 2025-03-22 22:05:38
* 开发者: MHF
* 邮箱: [email protected]
* 功能:
*********************************************************************************/
#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); //设置位置
#endif
vtkNew<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;
}
4. 演示效果
